通常,在遍历列表时,无法安全地从列表中删除项目。对于ES6地图来说,这个概念是否仍然是正确的?
我毫无例外地尝试了这个简单的测试:
var map = new Map([['a',1],['b',2],['c',3]]);
map.forEach((value,key,map)=>
{
map.delete(key);
let str = `["${key}",${value}] was deleted. `;
str += `map.size = ${map.size}`;
console.log(str);
});
看上去没问题。
更新:--我刚刚从Mozilla读取了这个参考文献。这当然是可行的。我对任何性能基准都感兴趣,将此删除方法与其他方法(在较大的数据集中)进行比较。
发布于 2017-09-11 05:57:55
我想你是对的。我不太熟悉ES6地图,但我做了一些研究,发现这个博客对地图的解释有点帮助:
https://hackernoon.com/what-you-should-know-about-es6-maps-dc66af6b9a1e
在这里,您还将得到删除机制的解释:
就像这样:
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)
希望这能有所帮助。
发布于 2017-09-11 05:54:49
为什么?如果您使用的是同一个实例,实际上可以删除。它具有用于删除项的函数,因此可以删除。
但是在优化方面,不删除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# ),您不能从for each loop
中的IEnumerable
中删除项,因为它在遮罩下以另一种方式工作,实际上它只允许您读取和更新访问,而不是删除。
https://stackoverflow.com/questions/46149010
复制相似问题