для петли и разрушения - PullRequest
0 голосов
/ 08 декабря 2018

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

0 голосов
/ 08 декабря 2018

В вашем первом случае, 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

0 голосов
/ 08 декабря 2018

Метод 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().

Если вы действительно хотите получить ключ first с соответствующим значением в 2 переменных, вам нужно написать:

var [[key, value]] = numbers.entries();
0 голосов
/ 08 декабря 2018

первое присваивание более понятно следующим образом:

var [set1, set2, set3, set4] = numbers.entries();

над фрагментами кода разрушает ключ, пару значений (набор).

С другой стороны, цикл for перечисляет болеекарту и получить каждый элемент по одному.когда вы ставите let [key, value], вы фактически разрушаете набор.

В результате цикл for выполняет итерации по заданному элементу, а затем для каждого заданного элемента использует деструктуризацию для назначения ключа и значения

...