Для петли и разрушения
Может ли кто-нибудь объяснить мне, как именно map.entries() и деструктурирование работают?
var numbers = new Map()
numbers.set(1,'one')
numbers.set(2,'two')
numbers.set(3,'three')
numbers.set(4,'four')
var [key,value] = numbers.entries() // returns key as [1,'one'] and value as [2,'two']
//but when using for..of loop
for(let [key,value] of numbers.entries()){
console.log(key,value)
} // it works and console logs keys and values
почему это работает в for..loop? и как метод.entries () работает точно? Я искал по всей сети и не мог понять это.
3 ответа
entries
Метод возвращает итератор. Каждое значение, которое дает итератор, является парой ключ / значение (массив с 2 элементами).
Один из способов справиться с этим - посмотреть, что произойдет, если вы добавите итератор в новый массив:
var numbers = new Map().set(1,'one').set(2,'two').set(3,'three').set(4,'four');
// Get everything from the iterator into a new array:
var arr = Array.from(numbers.entries());
console.log(arr);
Обратите внимание, что вы получаете серию пар ключ / значение в новый массив:
[ [1, "one"], [2, "two"], [3, "three"], [4, "four"] ]
Теперь к вашему коду. Первое назначение key
а также value
вводит в заблуждение, потому что вы не получаете один ключ и одно значение. Вместо этого вы берете первые две пары, которые дает entries()
итератор.
Если вы действительно хотите получить первый ключ с соответствующим значением в 2 переменных, вам нужно написать:
var [[key, value]] = numbers.entries();
Ваше первое назначение более понятно следующим образом:
var [set1, set2, set3, set4] = numbers.entries();
Приведенный выше фрагмент кода разрушает пару ключей, значений (набор).
С другой стороны, ваш цикл for перечисляет по карте и получает каждый заданный элемент один за другим. когда вы положите let [key, value]
вы на самом деле деструктурируете сами себя
В результате ваш цикл for выполняет итерации по заданному элементу, а затем для каждого заданного элемента использует деструктуризацию для назначения ключа и значения.
В вашем первом случае, numbers.entries()
обозначает массив, который содержит каждую запись в вашей карте.
var [key,value] = numbers.entries();
key
элемент с первым индексом (0) в numbers.entries()
массив, value
является вторым, и если у вас будет третье деструктурированное свойство, например, elem
это будет означать [3, 'three']
и так далее.
Во втором случае вы перебираете numbers.entries()
массив, так что в каждом цикле вы получаете только один элемент в этом массиве.
for (let [key, value] of numbers.entries())
Давайте упростим это:
for (let singleElement of numbers.entries())
Так с каждым циклом, singleElement
обозначает каждый вложенный массив внутри numbers.entries()
,
Итак, первый цикл будет [1, 'one']
, который после деструкции оценит в key
как 1
а также value
как one
и так далее.
let [key, value] = singleElement; // [1, 'one']
Если вы хотите узнать больше о Map
, посмотрите на: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map