JavaScript循环中对象属性未被删除的问题求助
问题排查与修复方案
咱们直接戳核心问题:你的代码里循环遍历的逻辑完全搞反了,导致根本没拿到要检查的目标属性名,自然触发不了删除操作。咱们一步步拆解问题:
1. 循环遍历的致命错误
你用Object.keys(device.fields)得到了temp,这是一个包含device.fields所有键名的数组。但你接下来用for(var property in temp)遍历这个数组——for...in遍历数组时,property拿到的是数组的索引(比如字符串"0"),而不是数组里存储的键名!
举个例子:如果temp = ["batteryCapacity"],那property的值会是"0",而不是"batteryCapacity"。这时候你去检查device.fields.hasOwnProperty("0"),显然这个属性不存在,后面的删除逻辑直接被跳过了。
2. 额外的冗余/无效逻辑
还有两个小问题需要注意:
forEach的返回值永远是undefined,所以const devices = searchResult.results.forEach(...)这个赋值完全没有意义,devices变量始终是undefined;- 你已经通过
Object.keys拿到了device.fields的所有自有属性,再用hasOwnProperty检查属于重复操作——因为Object.keys本来就只返回对象的自有可枚举属性。
修复后的代码
把遍历方式改成直接获取键名的形式,比如用for...of遍历Object.keys的结果:
// 不需要给forEach的返回值赋值,因为它不返回新数组 searchResult.results.forEach(device => { // 直接遍历device.fields的所有键名 for(const property of Object.keys(device.fields)) { if (!usedPropertiesAcrossModels.has(property)) { delete device.fields[property]; } } });
如果允许直接替换device.fields对象,还可以用更简洁的写法:
searchResult.results.forEach(device => { device.fields = Object.fromEntries( Object.entries(device.fields) .filter(([key]) => usedPropertiesAcrossModels.has(key)) ); });
为什么调试看到temp有元素却没删除?
因为temp里的元素确实是正确的属性名,但你遍历拿到的是数组索引(比如"0"),这个索引要么不在usedPropertiesAcrossModels集合里,要么device.fields根本没有以索引为名称的属性,导致删除逻辑从未执行。
内容的提问来源于stack exchange,提问作者Jeremy Fisher
相关产品推荐
相关产品推荐

