JavaScript - 将 Map 对象的所有键设置为一个值

3
我这里有这段代码:

我有这个代码:

const myMap = new Map()

myMap.set("banana", true)
myMap.set("apple", true)

Object.keys(myMap).forEach(key => {myMap.set(key, false)})

console.log(myMap.get("banana")) // returns true should return false
console.log(myMap.get("apple")) // returns true should return false

我希望将这个Map的所有值设置为false,但是完全没有效果。
我尝试了类似下面的方法:
Object.keys(myMap).forEach(key => myMap[key] = false)

但是这也不起作用。有没有一种方法可以将Map的所有键都填充为特定的值?请注意,这里的“填充”意味着将现有的值替换为指定的值。

尝试在循环中记录你正在遍历的内容 console.log(Object.keys(myMap)),看看它是否符合你的预期。 - undefined
2个回答

8
要在Map中设置值,必须明确调用Map.set方法。对于普通对象myMap[key] = value是无效的。同时,应该使用myMap.keys()方法获取该Map的键迭代器。

const myMap = new Map();

myMap.set("banana", true);
myMap.set("apple", true);

[...myMap.keys()].forEach((key) => {
  myMap.set(key, false);
});

console.log(myMap.get("banana"));
console.log(myMap.get("apple"));


1
有没有特别的原因,你要在一个数组里使用 spread 操作符将键值展开,并且再使用数组原型对象的 .forEach() 方法? - undefined
forEach需要定义一个未使用的value参数,这在我看来有点丑陋。由于只需要键值,.keys()方法似乎是合适的选择,但不幸的是它返回的是一个迭代器而不是数组,所以我无法直接对其进行forEach操作。本可以使用for..of来避免扩展操作,但是当可能时,我更喜欢使用数组方法而不是for循环(你可以在这里找到更多关于我的偏好)。(我真希望.keys()和其他方法返回数组而不是迭代器,这样代码看起来会更好看) - undefined
是的,keys()entries() 都返回迭代器,感觉有点不一致,与 objects 可用的类似方法相比。我明白你的意思。无论如何,感谢你澄清我的问题,我只是好奇而已。 - undefined

7

对于这种情况,Map类拥有一个.forEach()方法来遍历它。您可以在此使用该方法:

const myMap = new Map();
myMap.set("banana", true);
myMap.set("apple", true);

myMap.forEach((value, key, map) => map.set(key, false));

console.log(
  "Banana:", myMap.get("banana"),
  "Apple:", myMap.get("apple")
);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

来自MDN的文档介绍了在每个元素上调用的回调函数:
“forEach” 方法对实际存在的每个键执行提供的回调一次。它不会为已删除的键调用。但是,对于存在但值为 undefined 的值,它将被执行。回调将使用三个参数调用: - 元素值 - 元素键 - 遍历中的 Map 对象

这也是一个非常好的答案。我觉得CertainPerformance的回答更加简洁,但我也尊重这个答案,并且它确实有效! - undefined
1
我刚意识到你的答案也同样好。如果我使用这段代码:myMap.forEach((_,key) => { myMap.set(key, false) })。你认为哪个更高效? - undefined
@Student22 如果你在谈论将数组扩展为创建一个新数组的比较,那么我相信除非你有一个包含大量元素(可能是百万级别)的数组,否则不会有明显的区别。在这种情况下,我会选择你所写的方法。 - undefined

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