How to filter object with array inside?

Viewed 78

I'm trying to filter everything inside 'items' with 'name': "", without losing structure and values of fieldLabel and placeholder. Below is my current object:

result: {
    "fieldLabel": "foo",
    "placeholder": "foo",
    "items": [
        {
            "name": "foobar"
        },
        
            "name": ""
        },
        {
            "name": ""
        }
    ]
}

I want the object to look like this after filtering:

result: {
   "fieldLabel": "foo",
   "placeholder": "foo",
   ​"items": [
       ​{
           ​"name": "foobar"
       ​},       ​       ​       ​
   ​]
}
3 Answers

You can filter the nested items array that have truthy name properties.

const result= {
  "fieldLabel": "foo",
  "placeholder": "foo",
  "items": [
    {
      "name": "foobar"
    },
    {
      "name": ""
    },
    {
      "name": ""
    }
  ]
};

result.items = result.items.filter(({ name }) => name);

console.log(result);

If you need to do this using an immutable pattern then shallow copy the object and nested properties that you are updating.

const result= {
  "fieldLabel": "foo",
  "placeholder": "foo",
  "items": [
    {
      "name": "foobar"
    },
    {
      "name": ""
    },
    {
      "name": ""
    }
  ]
};

const newresult = {
  ...result,
  items: result.items.filter(({ name }) => name)
};

console.log(newresult);
console.log(result === newresult); // false since new object

  1. Have a reference to the original object first.
const results = {
    "fieldLabel": "foo",
    "placeholder": "foo",
    "items": [
        {
            "name": "foobar"
        },
        {
            "name": ""
        },
        {
            "name": ""
        }
    ]
}
  1. Create a new object from the reference. Use spread syntax for copying object. Then filter method for filtering
const newObject = {
  ...results,
  items: results.items.filter(item => item.name)
}

Something like this?

Filter YOUROBJ.items to keep all entries where property name has a value that is not null/undefined/false

res.items = res.items.filter(e => e.name);

const obj = {
    "fieldLabel": "foo",
    "placeholder": "foo",
    "items": [
        {
            "name": "foobar"
        },
        {
            "name": ""
        },
        {
            "name": ""
        }
    ]
}

const res = Object.assign({}, obj); // copy object to not mutate the original one
res.items = res.items.filter(e => e.name); // filter array "items" to just keep items with property name
console.log(res);

Related