尝试了此示例后,对Javascript中的Maps和Set的基础感到困惑

时间:2019-06-28 10:08:55

标签: javascript arrays ecmascript-6 set javascript-objects

我正在尝试应用一些示例来更好地理解Map和Set的区别,并且每个行为似乎令人困惑。查看下面的示例和输出

地图示例:

let nameMap = new Map([
  ['name', 'stack'],
  ['name', 'overflow'],
  ['domain', 'technology']
]);

// iterate over keys (nameMap)
for (let name of nameMap) {
  console.log(JSON.stringify(name)); 
}

输出:

["name","overflow"]
["domain","technology"]

设置示例:

let nameSet = new Set([
  ['name', 'stack'],
  ['name', 'overflow'],
  ['domain', 'technology']
]);

// iterate over keys (nameSet)
for (let name of nameSet) {
  console.log(JSON.stringify(name));
}

输出:

["name","stack"]
["name","overflow"]
["domain","technology"]
  1. 我的问题是为什么map仅返回两个相似对象的第二次出现?
  2. Set返回所有三个对象,即使前两个键和值相同,但应该删除其中的一个。

3 个答案:

答案 0 :(得分:2)

  

我的问题是为什么地图仅返回两个相似对象的第二次出现?

因为地图包含一组键值对。每个键只能有一个值。在构造函数中,每个数组代表[key, value])。带有密钥'name'的第二个数据位将覆盖第一个数据。

  

Set返回所有三个对象,即使前两个键和值相同,但应该删除其中的一个。

一组存储一组唯一值。每个数组(例如['name', 'stack'])都是一个值。

答案 1 :(得分:0)

因为Set就像数组-它们只是将值存储在列表中。因此,构造函数会将所有三个数组添加到新Set中作为值。 Map构造函数类似于Object.fromEntries-每个子数组中的第一项是键,第二项是值。您不能将键存储在Set中,而只能存储值-因此,两项必须完全相同,并且必须将原始存储在Set中。

答案 2 :(得分:0)

Map是键值对的容器。在您的输入中,namedomain将成为键。由于密钥只能存在一次,因此密钥name会进行重复数据删除。

Set是一个值数组,对值本身进行重复数据删除。由于您的输入中没有相同的值,因此所有值都将保留。