For of 循环和解构赋值

4

能否有人向我解释一下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()方法具体是如何工作的?我在网上搜索了很久,但无法真正理解它。


1
你的第一个 [key, value] 赋值是误导性的。那里并没有获取到一个键和一个值。更好的命名方式应该是 [firstKeyValuePair, secondKeyValuePair],但我怀疑这甚至不是你想要的。 - trincot
1
你有没有阅读 mdn 上的文档?文档中也有非常清晰的示例...点击进入了解迭代器相关内容。 - trincot
1
请注意,在for..of循环中,您甚至不需要使用.entries(),因为该映射是直接可迭代的。 - Alnitak
这与地图及其条目没有直接关系,相反,您似乎基本上误解了赋值(=复制整个内容)和迭代(=复制每个部分的内容)之间的区别。 - georg
@badiechakibe:恐怕您仍然误解了您的错误所在。即使“entries”确实返回了一个数组,您仍将得到相同的结果。 - georg
显示剩余4条评论
3个回答

4
< p > entries 方法返回一个迭代器。迭代器产生的每个值都是一个键/值对(包含 2 个元素的数组)。< /p> < p > 理解这一点的一种方法是查看将迭代器消耗到新数组中时会发生什么:< /p>

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"] ]

现在来看你的代码。对于keyvalue的第一个赋值是有误导性的,因为你并没有获取一个键和一个值。相反,你正在获取由entries()迭代器生成的前两个键值对。
如果你真的想要用两个变量获取第一个键及其对应的值,你需要这样写:
var [[key, value]] = numbers.entries();

我现在认为我明白了!我所观看的课程忽略了一个非常重要的部分,那就是迭代器部分,这就是我感到困惑的原因。我以为 .entries() 方法会返回一个包含所有记录的对象,但它实际上是一个迭代器,这是不同的。感谢您的帮助! - blue
没事了!那跟我没关系,那是一个迭代器,但现在我明白了。问题是我得到了一系列的键值对,就像你说的,然后两个都被分配给了第一个变量,也就是键,然后第二个键值对被分配给了值,我现在懂了! - blue

2

你的第一个任务可以更易懂地表述为:

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

上面的代码段解构了键值对(set)。

另一方面,你的for循环枚举了map并逐个获取每个set项。 当你使用let [key, value]时,实际上是在解构set本身。

因此,你的for循环遍历了set项,然后对于每个set项,它使用解构来分配键和值。


2

在你的第一个案例中,numbers.entries()代表一个数组,其中包含你的Map中每个条目的信息。

var [key,value] = numbers.entries();

key 是在 numbers.entries() 数组中的第一个索引(0)元素,value 是第二个元素,如果您解构第三个属性,例如 elem,它将代表 [3, 'three'] 等等。

在您的第二种情况中,您正在循环遍历 numbers.entries() 数组,因此在每个周期中,您只会得到该数组中的单个元素。

for (let [key, value] of numbers.entries())

让我们简化它:

for (let singleElement of numbers.entries())

所以,每个循环中,singleElement代表numbers.entries()内的每个嵌套数组。

因此,第一个循环将是[1,'one'],解构后将评估为key1valueone,依此类推。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接