Наборы теперь доступны в ES2015 (он же ES6, то есть ECMAScript 6). ES6 является текущим стандартом для JavaScript с июня 2015 года.
ECMAScript 6 имеет структуру данных Set, которая работает для произвольных значений, работает быстро и правильно обрабатывает NaN. - Аксель Раушмайер , Исследование ES6
Первые два примера из книги Акселя Раушмайера Exploring ES6 :
Управление отдельными элементами:
> let set = new Set();
> set.add('red')
> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false
Определение размера Сета и его очистка:
> let set = new Set();
> set.add('red')
> set.add('green')
> set.size
2
> set.clear();
> set.size
0
Я бы посмотрел « Изучение ES6», если вы хотите узнать больше о наборах в JavaScript. Книгу можно бесплатно читать в Интернете, но если вы хотите поддержать автора доктора Акселя Раушмайера, вы можете приобрести книгу примерно за 30 долларов.
Если вы хотите использовать Sets и ES6, теперь вы можете использовать Babel , транспилятор ES6 в ES5 и его полифилы.
Изменить: по состоянию на 6 июня 2017 года большинство основных браузеров имеют полную поддержку Set в своих последних версиях (кроме IE 11). Это означает, что вам может не понадобиться babel, если вы не хотите поддерживать старые браузеры. Если вы хотите увидеть совместимость в разных браузерах, включая ваш текущий браузер, проверьте таблицу совместимости Kangax с ES6 .
РЕДАКТИРОВАТЬ:
Просто пояснение по инициализации. Наборы могут принимать любые синхронные итерации в своем конструкторе. Это означает, что они могут принимать не только массивы, но также строки и итераторы. Возьмем, например, следующий массив и инициализацию набора строк:
const set1 = new Set(['a','a','b','b','c','c']);
console.log(...set1);
console.log(set1.size);
const set2 = new Set("aabbcc");
console.log(...set2);
console.log(set2.size);
Оба выхода массива и строки одинаковы. Обратите внимание, что ...set1
это синтаксис распространения . Похоже, что каждый элемент итерации добавляется к набору один за другим, поэтому, поскольку и массив, и строка имеют одинаковые элементы и поскольку элементы находятся в одном порядке, набор создается одинаково. Еще одна вещь, которую следует отметить в отношении наборов, - это при повторении по ним порядок итерации следует за порядком, в котором элементы были вставлены в набор. Вот пример итерации по набору:
const set1 = new Set(['a','a','b','b','c','c']);
for(const element of set1) {
console.log(element);
}
Поскольку вы можете использовать любую итерацию для инициализации набора, вы даже можете использовать итератор из функции генератора . Вот два таких примера инициализации итератора, которые дают одинаковый результат:
function* getLetters1 () {
yield 'a';
yield 'a';
yield 'b';
yield 'b';
yield 'c';
yield 'c';
}
function* getLetters2 (letters, repeatTimes) {
for(const letter of letters) {
for(let i = 0; i < repeatTimes; ++i) {
yield letter;
}
}
}
console.log("------ getLetters1 ------");
console.log(...getLetters1());
const set3 = new Set(getLetters1());
console.log(...set3);
console.log(set3.size);
console.log("------ getLetters2 ------");
console.log(...getLetters2('abc', 2));
const set4 = new Set(getLetters2('abc', 2));
console.log(...set4);
console.log(set4.size);
Функции генератора в этих примерах можно было бы просто написать так, чтобы не повторяться, но если функция генератора более сложная и пока следующее не влияет на производительность слишком отрицательно, вы можете использовать метод Set, чтобы получить только значения от генератора, который не Не повторяю.
Если вы хотите узнать больше о наборах, не читая главу его книги доктора Раушмайера, вы можете ознакомиться с документацией MDN на Set . В MDN также есть больше примеров итерации по набору, таких как использование forEach
и использование.keys
, .values
и .entries
методы. В MDN также есть такие примеры, как объединение множеств, пересечение множеств, разность множеств, симметричная разность множеств и проверка расширенных множеств. Надеюсь, что большинство из этих операций станут доступны в JavaScript без необходимости создавать собственные поддерживающие их функции. Фактически, это предложение TC39 по новым методам Set, которые, мы надеемся, должны добавить следующие методы в Set в JavaScript в какой-то момент времени, если предложение достигнет стадии 4:
- Set.prototype.intersection (iterable) - метод создает новый экземпляр Set путем операции пересечения множества.
- Set.prototype.union (iterable) - метод создает новый экземпляр Set путем операции объединения множества.
- Set.prototype.difference (iterable) - метод создает новый Set без элементов, присутствующих в итерабельном.
- Set.prototype.symmetricDifference (iterable) - возвращает набор элементов, найденных только в этом или в итерабельном.
- Set.prototype.isSubsetOf (повторяемый)
- Set.prototype.isDisjointFrom (повторяемый)
- Set.prototype.isSupersetOf (повторяемый)
'Tom' in set
верно, будет выглядеть? Похоже, у вас есть неправильные предположения о чем-то , и я пытаюсь выяснить, о чем .