2

有人可以向我解释 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() 方法是如何工作的?我一直在寻找整个网络并且无法真正理解它。

4

3 回答 3

2

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对and的第一个分配value具有误导性,因为您没有得到一个键和一个值。entries()相反,您正在获取迭代器产生的前两对。

如果你真的想得到2个变量中对应值的第一个key,你需要写:

var [[key, value]] = numbers.entries();
于 2018-12-08T11:59:10.697 回答
1

你的第一个任务通过这种方式更容易理解:

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

上面的代码片段解构了键、值对(集合)。

另一方面,您的 for 循环遍历 map 并逐个获取每个设置项。当您放置时,let [key, value]您实际上是在解构集合本身。

结果,您的 for 循环遍历设置项,然后对于每个设置项,它使用解构来分配键和值

于 2018-12-08T11:57:26.907 回答
1

在您的第一种情况下,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'],解构后将评估为keyas1valueasone等等。

let [key, value] = singleElement; // [1, 'one']

如果您想了解更多关于 的信息Map,请考虑查看:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

于 2018-12-08T11:58:25.587 回答