Набори тепер доступні в 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
виглядати масив, для якого істинно? Схоже, у вас є про щось неправильні припущення , і я намагаюся з’ясувати, про що .