0

I have following array of object, I need to remove the object if the property didn't exist

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 }] },
];

Expected output

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 }] },
];

I tried the code but not working

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)

1
  • The outside filter has no Boolean, you do nothing with the internal filter Commented Jul 30, 2020 at 13:25

6 Answers 6

3

You can do that using reduce() method easily. As already someone gave the solution using the reduce() method. I did different way using map() and filter() method. You can try this. Thank you

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);
Sign up to request clarification or add additional context in comments.

Comments

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)}))
)    

3 Comments

object Ammu not fullfilled
Looked very promising, but you still have a { "age": 37 } in there
@mplungjan you were right. i have updated my answer :)
1

You can reduce the result set by filtering out items that have no valid fields.

For the items that are valid, you just filter their fields based on whether the data property is present and 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; }

Comments

1

Using 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)

Comments

0

Try use the below code:

obj = obj.filter(item => item.fields.find(field => field.data));
console.log(obj);

Comments

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)   

3 Comments

Where did ammu go?
its now there. but honestly, use the reduce() function as others stated
You do not need an else after a return

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.