Для петли и разрушения

Может ли кто-нибудь объяснить мне, как именно 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

Другие вопросы по тегам