如何移除数组中不含data属性的子对象及无效父对象?代码求助
解决数组过滤问题:移除不含
data的子对象及空fields的父对象 嘿,我来帮你搞定这个问题~先说说你现有代码的问题,再给你可行的解决方案。
你的代码有两个核心问题:
- 外层的
filter回调没有返回值,默认返回undefined,filter会把这个值转为布尔假值,但因为没有明确返回判断结果,导致所有父对象都被错误保留了; - 内层的
filter只执行了过滤逻辑,但没把结果赋值给父对象的fields属性,所以父对象的fields根本没被更新。
正确实现方式
我们可以分两步处理,逻辑更清晰:
- 用
map遍历每个父对象,过滤它的fields数组,只保留包含data属性的子对象; - 用
filter移除那些过滤后fields为空的父对象。
代码如下:
const obj = [ { name: 'Anu', fields: [{ age: 27, data: true }, { age: 17, data: true }] }, { name: 'Ammu', fields: [{ age: 47, data: true }, { age: 37 }] }, { name: 'Bat', fields: [{ age: 30 }] }, { name: 'Asmi', fields: [{ age: 27, data: true }] }, ]; const res = obj .map(item => { // 过滤fields,只保留包含data属性的子对象 const filteredFields = item.fields.filter(field => 'data' in field); // 返回新对象,避免修改原数组(若不需要保留原数组,也可直接修改item.fields) return { ...item, fields: filteredFields }; }) // 过滤掉fields为空的父对象 .filter(item => item.fields.length > 0); console.log(res);
代码细节说明
'data' in field:判断子对象是否包含data属性,比Object.keys(field).includes("data")更高效;{ ...item, fields: filteredFields }:创建新的父对象,避免直接修改原数组元素(如果允许修改原数组,也可以直接写item.fields = filteredFields; return item;);- 最后一步的
filter确保只有fields不为空的父对象会被保留。
运行这段代码后,就能得到你预期的输出啦~
内容的提问来源于stack exchange,提问作者Rijo
相关产品推荐
相关产品推荐

