为何JavaScript中Set的size在删除Map内部键后仍保持为2?
为什么两次打印Set的size都是2?
你写的代码里,原本期望删除Set中的一个Map实例,但实际上只是修改了Map内部的键值对,所以Set的size没有变化。
先看你的原始代码:
const topmap = new Map(); const map1 = new Map(); const map2 = new Map(); const set1 = new Set(); map1.set('x','y'); map1.set('a','b'); set1.add(map1); set1.add(map2); topmap.set('ID',set1); console.log(topmap.get('ID').size); // 打印2 topmap.get('ID').forEach(x => { if(x.has('x')){x.delete('x')} }) console.log(topmap.get('ID').size) // 还是打印2
问题原因
你在forEach里调用的x.delete('x')是Map对象的delete方法,作用是删除map1这个Map里的键为'x'的键值对,而不是把map1从Set中移除。Set里的两个Map实例(map1和map2)都还存在,所以size始终是2。
正确实现
如果要把包含键'x'的Map从Set中删除,需要调用Set的delete方法,代码修改如下:
const topmap = new Map(); const map1 = new Map(); const map2 = new Map(); const set1 = new Set(); map1.set('x','y'); map1.set('a','b'); set1.add(map1); set1.add(map2); topmap.set('ID',set1); console.log(topmap.get('ID').size); // 打印2 const targetSet = topmap.get('ID'); targetSet.forEach(x => { if(x.has('x')){ targetSet.delete(x); // 调用Set的delete方法移除元素 } }) console.log(topmap.get('ID').size) // 打印1
这样修改后,第二次打印的size就会变成1,因为map1已经被从Set中成功移除了。
内容的提问来源于stack exchange,提问作者yazumin
相关产品推荐
相关产品推荐

