Cодержание

Руководство ECMAScript Set Collection (ES6)

1- Collections - Set

ECMAScript 6 представляет 2 новые структуры данных это  Map & Set. Они являются частью в коллекции фреймворк (Collections Framework) у  ECMAScript.
  • Maps - Данная структура данных позволяет вам сохранять пары "Ключ/Значение" (Key/Value). И вы можете получить доступ в значение (value) через ключ(key), или обновить новое значение соответствующее с определенным ключом.
  • Sets - Данная структура данных сохраняет список элементов, не позволяющих совпадать и не индексирующих элементы.
В данной статье я представлю вам  Set.
Смотрите так же:

Set

Set это структура данных представленная в ECMAScript6, далее являются характеристики  Set:
  • Set это список содержащий элементы, но не позволяет повторяться.
  • Set не индексирует элементы.
  • Set это список с порядком (Ordered), это значит элемент добавленный первым будет стоять спереди. элемент добавленный после будет стоять сзади.
Constructors:
Создать объект  Set через constructor класса  Set:
new Set( [iterable] )
Параметры:
  • iterable - Если данный объект передается (pass) в constructor у Set все элементы имеющие его будут добавлены в Set. Наоборот если вы не определили данный параметр, или его значение null то созданный объект Set будет пустым (empty).
Properties:
set-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

console.log(fruits); // Set { 'Apple', 'Banana', 'Papaya' }
Property Описание
size Данное свойство (Property) возвращает число элементов объекта Set.
set-size-example.js
// Create a Set from an Array
var fruits = new Set( ['Apple','Banana','Papaya'] );

var size = fruits.size;

console.log(size); // 3

for..of

Вы можете использовать цикл  for...of для повторения элементов у Set.
set-for-of-loop-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

for(let fruit of fruits)  {

  console.log(fruit);

}

2- Методы Set

add(value)

Добавить элемент в конец  Set если данный элемент не существует в  Set. И вернуть данный объект  Set.
set-add-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

// Append an Element to the Set and returns this Set.
var thisFruits = fruits.add("Cherry");

console.log(fruits); // Set { 'Apple', 'Banana', 'Papaya', 'Cherry' }

// 'Set' does not allow duplicates
fruits.add("Banana");

console.log(fruits); // Set { 'Apple', 'Banana', 'Papaya', 'Cherry' }

delete(value)

Данный метод используется для удаления элемента из Set. Метод возвращает  true если находит элемент для удаления, напротив возвращает false.
set-delete-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

console.log(fruits); // Set { 'Apple', 'Banana', 'Papaya' }

// Delete an element:
var deleted = fruits.delete("Banana");

console.log("Deleted? " + deleted); // true

console.log(fruits); // Set { 'Apple', 'Papaya' }

clear()

Удаляет все элементы из  Set.
set-clear-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

console.log(fruits); // Set { 'Apple', 'Banana', 'Papaya' }

// Remove all elements.
fruits.clear();

console.log(fruits); // Set { }

console.log("Size after clear: " + fruits.size);

entries()

Данный метод возвращает новый объект  Iterator, где каждый его  entry (ввод) содержит массив с 2-мя элементами  [value, value], порядок  entry сохраняется как порядок элементов в объекте Set. (Смотрите изображение ниже).

set-entries-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

console.log(fruits); // Set { 'Apple', 'Banana', 'Papaya' }

// Iterator Object:
var iteratorEntries = fruits.entries();

var entry;

while( !(entry = iteratorEntries.next() ).done )  {

    console.log(entry.value); // [ 'Apple', 'Apple' ]
}

has(value)

Данный метод проверяет значение данное параметром существует в Set или нет. Возвращает  true если существует, напротив возвращает  false.
set-has-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

var has = fruits.has("Banana");

console.log(has); // true

forEach(callbackFn[, thisArg])

Данный метод вызывает функцию  callbackFn один раз для каждого элемента  Set.
mySet.forEach(callbackFn [, thisArg])
 
Параметры:
  • callbackFn - Данная функция будет вызвана один раз в соответствии с каждым элементом объекта Set.
  • thisArg - Параметр используется как this при выполнении функции callbackFn.
set-forEach-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

console.log(fruits); // Set { 'Apple', 'Banana', 'Papaya' }

function showFruit(fruit, thisSet) {
  console.log("Fruit: " + fruit);
}

// Or Call: fruits.forEach(showFruit);
fruits.forEach(showFruit, fruits);
 

key() & values()

Метод  key() & values() возвращает новый объект  Iterator, где каждый элемент у  Iterator имеет вид  {value: aValue, done: false}.
set-values-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );


var fruitIterator = fruits.values();

var entry;
while ( !(entry = fruitIterator.next()).done)  {
   console.log(entry); // { value: 'Apple', done: false }
   console.log(entry.value); // Apple
}

mySet[Symbol.iterator]

Symbol.iterator являет специальным  property объекта  Set. По умолчанию, значение у  mySet[Symbol.iterator] это метод  values() объекта  mySet.
set-symbol-iterator-example.js
// Create a Set from an Array
var fruits = new Set( ["Apple","Banana","Papaya"] );

// Same as: fruits.values()
var fruitIterator = fruits[Symbol.iterator]();

var entry;
while ( !(entry = fruitIterator.next()).done)  {
   console.log(entry); // { value: 'Apple', done: false }
   console.log(entry.value); // Apple
}

3- WeakSet

В основном  WeakSet довольно похож на  Set, но имеет следующие отличия:
  • Элементы WeakSet должны быть объектами, не могут быть примитивным видом (Primitive).
  • Элементы WeakSet могут быть удалены в процессе (process) коллекции мусора (Garbage collection), это независимый процесс для удаления неиспользующихся объектов в программе.
  • WeakSet не поддерживает property: size, поэтому вы не можете знать сколько элементов он имеет.
  • Имеется много методов в классе Set но не имеется класса WeakSet, например values(), keys(), clear(),..
Примечание: Вы не можете использовать цикл  for..of для  WeakSet, и нет способа, чтобы вы повторили (iterate) на элементах у  WeakSet.
Создать объект  WeakSet.
new Set( [iterable] )
Параметры:
  • iterable - Если данный объект передается в (pass) constructor у WeakSet все элементы, которые он имеет будут добавлены в Set. Напротив, если вы не определили данный параметр, или его значение является null то созданный объект Set будет пустым (empty).

Methods:

Количество методов у WeakSet меньше по сравнению с количеством методов у Set:
  1. WeakSet.add(element)
  2. WeakSet.delete(element)
  3. WeakSet.has(element)
Элементы в  WeakSet должны быть объектами, они не могут быть примитивным видом (Primitive).
let w = new WeakSet();
w.add('a'); // TypeError: Invalid value used in weak set

let s = new Set();
s.add('a'); // Works
weakset-example.js
var element1 = {}; // An Object
var element2 = {foo: "bar"};
var element3 = {bar: "foo"};


var myWeakSet = new WeakSet( [element1, element2] );
myWeakSet.add(element3);

console.log(myWeakSet.has(element2)); // true