通常,在循环浏览列表时,无法安全地从列表中删除项目。这个概念对于ES6地图是否仍然适用?
我尝试了这个简单的测试,没有例外:
var map = new Map([['a',1],['b',2],['c',3]]);
map.forEach((value,key,map)=>
{
map.delete(key);
});
console.log(map);
似乎没问题。
更新:我刚刚从Mozilla阅读此reference。这肯定是可行的。我对任何与其他方法(在较大的数据集上)比较这种删除方法的性能基准感兴趣。
答案 0 :(得分:4)
嗯,我猜你是对的。我对ES6地图不太熟悉,但做了一些研究,发现这个博客在解释有关MAPS时有点帮助:
在这里你也会得到删除机制的解释:
像这样:
var m = new Map()
m.set('a', 1)
m.set('b', 2)
m.delete('a'); // true
m.delete('c'); // false (key was not there to delete)
希望这有帮助。
答案 1 :(得分:3)
为什么呢?如果您正在使用同一个实例,实际上您可以删除。它具有用于删除项目的功能,因此您可以删除。
但是,从优化一侧,不要删除Map
或array
中的任何项目。 Javascript引擎根据对象的形状进行优化。如果它是相同的,则某些引用该对象,它将被优化。而不是从当前对象的过滤值创建一个新对象。
var map = new Map([['a',1],['b',2],['c',3]]);
map.forEach((value,key,map)=>
{
map.delete(key);
});
console.log(map);

有一些语言(C#),您无法从IEnumerable
中的for each loop
删除项目,因为它在另一种方式下工作,实际上它只会让您阅读并更新访问权限,而不是删除。