betacode

Руководство JavaScript Set Collection

  1. Collections - Set
  2. Методы Set
  3. WeakSet

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);

}
Output:
Apple
Banana
Papaya

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' }
Output:
Set { 'Apple', 'Banana', 'Papaya', 'Cherry' }
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
}
Output:
{ value: 'Apple', done: false }
Apple
{ value: 'Banana', done: false }
Banana
{ value: 'Papaya', done: false }
Papaya
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:
  • WeakSet.add(element)
  • WeakSet.delete(element)
  • 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

Pуководства ECMAScript, Javascript

Show More