纯JS按指定键列表保留对象属性,代码无法得到预期结果错在哪?
错误原因分析
- 浅拷贝问题:
collections.slice()仅能实现数组的浅拷贝,数组内存储的对象还是和原数组共享引用,直接修改属性会污染原数组的原始数据。 - 删除属性语法错误:
delete key属于无效操作,key只是属性名的字符串,要删除对应对象的属性,正确写法是delete newCollections[i][key]。 - 保留字段逻辑错误:当前嵌套循环的判断逻辑是只要属性名不等于当前遍历到的保留字段就执行删除,会误删合法的保留字段。比如保留字段是
name和age,当遍历到属性name、匹配第二个保留字段age时,就会触发不等于的判断,错误删除name属性。 - 提前终止运行:代码首次进入删除判断时就执行了
return newCollections,整个逻辑仅处理了第一个对象的第一个属性就直接返回结果,后续所有元素都没有被处理。
修正后代码
let collections = [ { name: "Tom", gender: "male", age: 12 }, { name: "Becky", gender: "female", age: 11 }, { name: "Huck", gender: "male", age: 13 } ]; let operations = { select: function () { const keepFields = [].slice.call(arguments); // 生成新数组和新对象,避免污染原数据 return collections.map(item => { const newItem = {}; keepFields.forEach(field => { newItem[field] = item[field]; }) return newItem; }) } }; const result = operations.select("name", "age"); console.log(result);
运行后输出的结果为仅保留name和age字段的新对象数组,不会修改原数组数据。
内容的提问来源于stack exchange,提问作者Che
相关产品推荐
相关产品推荐

