Map в JavaScript

Jun 24, 2018

Тип Map - это упорядоченный список пар ключ/значение (или, этот список можно назвать ассоциативным массивом) позволяют; кроме того, Map позволяют использовать в качестве ключей любой объект, а не только Strings и Symbols.

Эквивалентность ключей определяется методом Object.is().

Map использует get() и set() методы, чтобы получить доступ к значениям хранимыми Map.

new Map() : Map

Создадим пустой Map и добавим ему некоторые значения:

// 1. Создадим пустой Map и добавим ему некоторые значения
var objectKey = { foo: 'bar' };

var x = new Map();
x.set(1, 'keys are not converted to strings');
x.set('1', 'this is stored separately than the previous value');
x.set(objectKey, ['you use arbitrary objects as keys and values']);

console.log(x.get(1)); //keys are not converted to strings
console.log(x.get('1')); //this is stored separately than the previous value
console.log(x.get(objectKey)); //[ "you use arbitrary objects as keys and values" ]

new Map(iterable : Object) : Map

Создадим Map, передав в качестве аргументов в функцию-конструктор Map массивы, при этом каждый массива должен быть с двумя элементами, первый - это ключ, а второй - значение.

new Map(iterable : Object) : Map
var objectKey = { foo: 'bar' };
var fromArray = new Map([[0, 'array0'], [objectKey, 'array1']]);

console.log(fromArray.get(0)); // array0
console.log(fromArray.get(objectKey)); //array1
console.log();

var generator = function*() {
  yield [0, 'generator0'];
  yield [objectKey, 'generator1'];
};

var fromGenerator = new Map(generator());
console.log(fromGenerator.get(0)); // generator0
console.log(fromGenerator.get(objectKey)); // generator1

Свойство экземпляра size

var x = new Map([['a', 'value A'], ['b', 'value B'], ['c', 'value C']]);
console.log(x.size); // 3
x.set('d', 'value D');
console.log(x.size); // 4
x.clear();
console.log(x.size); // 0

Методы экземпляра

delete

delete - удаляет key и соответствующее ему значение. Возвращает true, если ключ был в this перед удалением.

var x = new Map([['a', 'value A'], ['b', 'value B'], ['c', 'value C']]);

console.log('size before delete: ' + x.size);   // size before delete: 3
console.log('deleted "a" = ' + x.delete('a'));  // deleted "a" = true

console.log('size after delete: ' + x.size);    // size after delete: 2
console.log('value for "a" = ' + x.get('a'));   // value for "a" = undefined

console.log('deleted "foo" = ' + x.delete('foo'));  // deleted "foo" = false
console.log('size after delete: ' + x.size);        // size after delete: 2

entries

Метод entries() возвращает итератор, содержащий пары [key, value] для каждого элемента объекта Map в том порядке, в котором они были добавлены.

var x = new Map([['a', 'value A'], ['b', 'value B'], ['c', 'value C']]);

// entries is returned by x[Symbol.iterator] so you can just
// use x directly in the for (... of ...) loop
for (var value of x) {
    console.log(value);
}
/*
[ 'a', 'value A' ]
[ 'b', 'value B' ]
[ 'c', 'value C' ]
*/
// You can iterate over entries explicitly
for (var entry of x.entries()) {
    console.log(entry);
}

/*
[ 'a', 'value A' ]
[ 'b', 'value B' ]
[ 'c', 'value C' ]
*/

// Or access the iterator manually
var entries = x.entries();

console.log(entries.next()); // { value: [ 'a', 'value A' ], done: false }
console.log(entries.next()); // { value: [ 'b', 'value B' ], done: false }
console.log(entries.next()); // { value: [ 'c', 'value C' ], done: false }
console.log(entries.next()); // { value: undefined, done: true }

forEach

Вызывает callback для каждой пары key/value в this.

var x = new Map([['a', 'value A'], ['b', 'value B'], ['c', 'value C']]);

x.forEach(function(value, key, map) {
    console.log('key: "' + key + '", value: "' + value + '"');
});
/*
key: "a", value: "value A"
key: "b", value: "value B"
key: "c", value: "value C"
*/

has

Метод has() возвращает тип Boolean, указывающий существует ли элемент с указанным ключом или нет.

get

Возвращает значение соответствующее ключу. Если значения нет вернет undefined.

var x = new Map([['a', 'value A'], ['b', 'value B'], ['c', 'value C']]);

console.log(x.get('a'));    // value A
console.log(x.get('b'));    // value B

// Notice the values stored in the map are not properties on
// the object. get() is the only way to retrieve the values.

console.log(x['b']);    // undefined

set

Сохраняет значение в this по указанному ключу. Если значение для ключа уже существует, оно будет заменено на value. Возвращает this.

var x = new Map([
    ['a', 'value A'],
    ['b', 'value B'],
    ['c', 'value C']
]);

console.log(x.get('a')); // value A

x.set('a', 'a different value');
console.log(x.get('a')); // a different value

values

Метод values() возвращает итератор, содержащий value для каждого элемента объекта Map в том порядке, в котором они были добавлены.

var x = new Map([['a', 'value A'], ['b', 'value B'], ['c', 'value C']]);

// Use for (... of ...) to loop over the iterator
for (var value of x.values()) {
    console.log(value);
}

/*
'value A'
'value B'
'value C'
*/


// Or access the iterator manually
var values = x.values();

console.log(values.next()); // { value: 'value A', done: false }
console.log(values.next()); // { value: 'value B', done: false }
console.log(values.next()); // { value: 'value C', done: false }
console.log(values.next()); // { value: undefined, done: true }

keys

Метод keys() возвращает итератор, содержащий key для каждого элемента объекта Map в том порядке, в котором они были добавлены.

// Use for (... of ...) to loop over the iterator
for (var key of x.keys()) {
    console.dir(key);
}

// Or access the iterator manually
var keys = x.keys();

console.dir(keys.next());
console.dir(keys.next());
console.dir(keys.next());
console.dir(keys.next());

Пример на jsfiddle

https://jsfiddle.net/9ucar58g/embed/js/dark/

По материалам javascripture.com:Map

Добавить комментарий