Как отфильтровать объект с массивом внутри?

#javascript #object

Вопрос:

Я пытаюсь отфильтровать все внутри «элементов» с помощью «имени»:»», не теряя структуру и значения метки поля и заполнителя. Ниже приведен мой текущий объект:

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

Я хочу, чтобы объект выглядел так после фильтрации:

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

Ответ №1:

  1. Сначала укажите ссылку на исходный объект.
 const results = {
    "fieldLabel": "foo",
    "placeholder": "foo",
    "items": [
        {
            "name": "foobar"
        },
        {
            "name": ""
        },
        {
            "name": ""
        }
    ]
}
 
  1. Создайте новый объект на основе ссылки. Используйте синтаксис распространения для копирования объекта. Затем отфильтруйте способ фильтрации
 const newObject = {
  ...results,
  items: results.items.filter(item => item.name)
}
 

Комментарии:

1. Это то, что я искал. Спасибо!!

Ответ №2:

Вы можете отфильтровать вложенный items массив, обладающий истинными name свойствами.

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

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

console.log(result); 

Если вам нужно сделать это с помощью неизменяемого шаблона, затем скопируйте объект и вложенные свойства, которые вы обновляете.

 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. Спасибо, использование синтаксиса распространения было отличным решением.

2. @RyRyWilli Добро пожаловать. Не забудьте также проголосовать за полезные и/или полезные вопросы, ответы и комментарии, которые вы найдете здесь, на stackoverflow. Ура и удачи.

Ответ №3:

Что-то вроде этого?

Фильтр YOUROBJ.items для сохранения всех записей, в которых имя свойства имеет значение, не являющееся нулевым/неопределенным/ложным

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