Набори тепер доступні в ES2015 (він же ES6, тобто ECMAScript 6). ES6 є чинним стандартом JavaScript з червня 2015 року.
ECMAScript 6 має набір даних, який працює для довільних значень, швидко і правильно обробляє NaN. - Аксель Раушмайер , Досліджуючи ES6
Перші два приклади з книги Акселя Раушмайєра « Дослідження 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
Я хотів би ознайомитися з Exploring ES6, якщо ви хочете дізнатись більше про набори в JavaScript. Книгу можна читати безкоштовно в Інтернеті, але якщо ви хочете підтримати автора доктора Акселя Раушмайера, ви можете придбати книгу приблизно за 30 доларів.
Якщо ви хочете використовувати набори та 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 щодо набору . 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 без елементів, присутніх в iterable.
- Set.prototype.symmetricDifference (iterable) - повертає набір елементів, знайдених лише в цьому або в ітерабельному.
- Set.prototype.isSubsetOf (ітерабельний)
- Set.prototype.isDisjointFrom (ітерабельний)
- Set.prototype.isSupersetOf (ітерабельний)
'Tom' in setвиглядати масив, для якого істинно? Схоже, у вас є про щось неправильні припущення , і я намагаюся з’ясувати, про що .