如果属性不存在,则从数组中删除对象

时间:2020-07-30 13:22:08

标签: javascript

我有以下对象数组,如果属性不存在,我需要删除对象

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)

6 个答案:

答案 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)   

相关问题