我有以下对象数组,如果属性不存在,我需要删除对象
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 = [
{ name: 'Anu', fields: [{ age: 27, data: true }, { age: 17, data: true }] },
{ name: 'Ammu', fields: [{ age: 47, data: true }] },
{ name: 'Asmi', fields: [{ age: 27, data: true }] },
];
我尝试了代码,但没有用
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 newArray = obj.filter((ob) => {
ob.fields.filter((field) => {
return Object.keys(field).includes("data");
});
});
console.log(newArray)
答案 0 :(得分:3)
您可以使用reduce()方法轻松地做到这一点。正如已经有人使用reduce()方法给出了解决方案。我使用map()和filter()方法做了不同的事情。你可以试试看谢谢
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 }] },
];
let newArray = obj.map((item) => {
let fields;
let f = item.fields.filter((a) => a.data);
if (f.length > 0) {
fields = f;
}
return { ...item, fields };
}).filter((f) => f.fields);
console.log(newArray);
答案 1 :(得分:2)
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 }] }, ]
console.log(
obj.filter(x => x.fields.find(y => y.data)).map(a => ({...a, fields: a.fields.filter(b => b.data)}))
)
答案 2 :(得分:1)
您可以通过过滤掉没有有效字段的项目来减少结果集。
对于有效的项目,只需根据是否存在data
属性和true
来过滤其字段。
const arr = [
{ 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} ] },
];
console.log(arr.reduce((res, item) =>
((fields) => fields.length ? [ ...res, { ...item, fields } ] : res)
(item.fields.filter(field => field.data))
, []));
.as-console-wrapper { top: 0; max-height: 100% !important; }
答案 3 :(得分:1)
使用reduce()
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 newArray = obj.reduce((a, ob) => {
let fields = ob.fields.filter(i => i.data)
let obj = {...ob, fields}
return fields.length ? [...a, obj]: a
}, []);
console.log(newArray)
答案 4 :(得分:0)
尝试使用以下代码:
obj = obj.filter(item => item.fields.find(field => field.data));
console.log(obj);
答案 5 :(得分:0)
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 newArray = obj.filter((ob) => {
let newFields = ob.fields.filter((field) => Object.keys(field).includes('data'));
if (newFields.length > 0) {
ob.fields = newFields;
return true;
}
});
console.log(newArray)