ES6: Set, Map, WeakSet и WeakMap

ES6: Set, Map, WeakSet и WeakMap

Front-end 04.06.2018

Set

Set — коллекция значений в любом формате, представленных в одном единственном экземпляре.

let set = new Set();
    
set.add("js");
set.add("node js");
set.add("java");
set.add("js");
set.add("node js");
 
// set сохраняет только уникальные значения
alert( set.size ); // 3
    
set.forEach( str => alert(str) ); // js, node js, java

Методы:

  • Set.prototype.add(value) — добавляет значение в set
  • Set.prototype.clear() — удаляет все элементы с set
  • Set.prototype.delete(value) — удаляет элемент с определенным значением
  • Set.prototype.has(value) — возвращает true если элемент с таким значением есть в set и false если нет
  • Set.prototype.entries()  — возвращает new Iterator который включает в себя массив значений
  • Set.prototype.forEach(callbackFn[, thisArg]) — вызывает callback функцию для каждого элемента в порядке добавления элементов  в set
  • Set.prototype.values() — возвращает new Iterator который включает в себя значения
  • Set.prototype.keys() —  работает аналогично Set.prototype.values()
  • Set.prototype[@@iterator]() — возвращает new Iterator который включает в себя массив значений в порядке добавления

Рассмотрим методы, которые не представлены в первом примере.

Demo: Set.prototype.delete()

const set1 = new Set();
set1.add(100).add(20);
set1.delete(100);

console.log(set1.size);
// expected output: 1

Demo: Set.prototype.entries()

const set1 = new Set();
set1.add(42);
set1.add('forty two');

const iterator1 = set1.entries();

for (let entry of iterator1) {
  console.log(entry);
  // expected output: [42, 42]
  // expected output: ["forty two", "forty two"]
}

Demo: Set.prototype.forEach()

function logSetElements(value1, value2, set) {
  console.log('s[' + value1 + '] = ' + value2);
}

new Set(['foo', 'bar', undefined]).forEach(logSetElements);

// expected output: "s[foo] = foo"
// expected output: "s[bar] = bar"
// expected output: "s[undefined] = undefined"

Demo: Set.prototype.values

const set1 = new Set();
set1.add(42);
set1.add('forty two');

var iterator1 = set1.values();

console.log(iterator1.next().value);
// expected output: 42

console.log(iterator1.next().value);
// expected output: "forty two"

Demo: Set.prototype[@@iterator]()


const set1 = new Set();

set1.add(42);
set1.add('forty two');

const iterator1 = set1[Symbol.iterator]();

console.log(iterator1.next().value);
// expected output: 42

console.log(iterator1.next().value);
// expected output: "forty two"

Обход Set 

for (let item of mySet) console.log(item);

for (let item of mySet.keys()) console.log(item);

for (let item of mySet.values()) console.log(item); // key и value в данном случае одинаковы

Map

Map — коллекция для хранения данных в виде ключ : значение, но, в отличии от обычных ассоциативных массивов, ключем может быть любой тип (как примитивы так и объекты).

let map = new Map();
    
map.set('str1', 'Hello world');   // ключ-строка
map.set(1, 20.17);     // число
map.set(true, 'we can & get data'); // булевое значение
    
console.log( map.get('str1') ); // 'Hello world'
console.log( map.get(1) ); // 20.17
console.log( map.get(true) ); // 'we can & get data'
    
console.log( map.size ); // 3

Методы:

  • Map.prototype.set(key, value) — добавляет значение
  • Map.prototype.get(key) — считывает значение по ключу
  • Map.prototype.size — кол-во элементов в Map
  • Map.prototype.clear() — удалит все пары ключи/значения в map
  • Map.prototype.delete(key) — удалит определенную пару ключ/значение, поиск по ключу. Вернет true если этот ключ будет найден и удален и false — если ключ не будет найден в map
  • Map.prototype.entries() — возвращает new Iterator который включает в себя массив [ключ, значение]
  • Map.prototype.forEach(callback()) — вызывает callback функцию для каждой пары в map
  • Map.prototype.keys() — возвращает new Iterator  который включает в себя ключи
  • Map.prototype.values() — возвращает new Iterator который включает в себя значения
  • Map.prototype[@@iterator]() — возвращает new Iterator который включает в себя массив [ключ, значение]

Некоторые методы мы рассмотрели выше в примере, некоторые довольно простые, но есть и те, в которых без примера не разобраться. Остановим свое внимание на методах, которые используют new Iterator.

Demo: Map.prototype.entries()

var map1 = new Map();

map1.set('0', 'foo');
map1.set(1, 'bar');

var iterator1 = map1.entries();

console.log(iterator1.next().value);
// expected output: ["0", "foo"]

console.log(iterator1.next().value);
// expected output: [1, "bar"]

Demo: Map.prototype.forEach()

function logMapElements(value, key, map) {
  console.log(`m[${key}] = ${value}`);
}

new Map([['foo', 3], ['bar', {}], ['baz', undefined]])
  .forEach(logMapElements);

// expected output: "m[foo] = 3"
// expected output: "m[bar] = [object Object]"
// expected output: "m[baz] = undefined"

Demo: Map.prototype.keys()

var map1 = new Map();

map1.set('0', 'foo');
map1.set(1, 'bar');

var iterator1 = map1.keys();

console.log(iterator1.next().value);
// expected output: "0"

console.log(iterator1.next().value);
// expected output: 1

Demo: Map.prototype[@@iterator]()

var map1 = new Map();

map1.set('0', 'foo');
map1.set(1, 'bar');

var iterator1 = map1[Symbol.iterator]();

for (let item of iterator1) {
  console.log(item);
  // expected output: Array ["0", "foo"]
  // expected output: Array [1, "bar"]
}

Обход Map 

for (var [key, value] of myMap) {
  alert(key + " = " + value);
}

for (var key of myMap.keys()) {
  alert(key);
}

for (var value of myMap.values()) {
  alert(value);
}

for (var [key, value] of myMap.entries()) {
  alert(key + " = " + value);
}

myMap.forEach(function(value, key, myMap) {
  alert(key + " = " + value);
})

WeakSet

WeakSet — коллекция значений, формат которых могут быть только объекты, представленные в одном единственном экземпляре.

Ссылки на объекты в WeakSet являются слабыми: если на объект, хранимый в WeakSet нет ни одной внешней ссылки, то сборщик мусора удалит этот объект. Также это означает, что WeakSet не итерируем, так как нет возможности получить список текущих хранимых в WeakSet объектов.

const weakset1 = new WeakSet();
const object1 = {'a': 'b'};

weakset1.add(object1);
console.log(weakset1.has(object1)); // true

weakset1.delete(object1)
console.log(weakset1.has(object1)); // false

Методы:

  • WeakSet.prototype.add(value) — добавляет обьект в WeakSet
  • WeakSet.prototype.delete(value) — удаляет из WeakSet элемент
  • WeakSet.prototype.has(value) — возвращает true если элемент с таким значением есть в WeakSet и false если нет

WeakMap

WeakMap — коллекция пар ключ-значение, где в качестве ключей могут быть использованы только объекты, а значения могут быть произвольных типов.

const weakmap1 = new WeakMap();
const object1 = {};
const object2 = {'a': 'b'};

weakmap1.set(object1, 'foo');
weakmap1.set(object2, 'foo2');

console.log(weakmap1.get(object1));
//expected output: "foo"
console.log(weakmap1.has(object2));
//expected output: true

Методы:

  • WeakMap.prototype.set(key, value) — добавляет значение в WeakMap
  • WeakMap.prototype.get(key)— возвращает значение из WeakMap по key
  • WeakMap.prototype.delete(key) — удаляет из WeakMap элемент по key
  • WeakMap.prototype.has(key)— возвращает true если элемент с таким ключем есть в WeakMap и false если нет

 

Поделиться:

Отправить ответ

avatar
  Subscribe  
Notify of