#javascript #object
Вопрос:
Я пытаюсь отфильтровать все внутри «элементов» с помощью «имени»:»», не теряя структуру и значения метки поля и заполнителя. Ниже приведен мой текущий объект:
result: {
"fieldLabel": "foo",
"placeholder": "foo",
"items": [
{
"name": "foobar"
},
"name": ""
},
{
"name": ""
}
]
}
Я хочу, чтобы объект выглядел так после фильтрации:
result: {
"fieldLabel": "foo",
"placeholder": "foo",
"items": [
{
"name": "foobar"
},
]
}
Ответ №1:
- Сначала укажите ссылку на исходный объект.
const results = {
"fieldLabel": "foo",
"placeholder": "foo",
"items": [
{
"name": "foobar"
},
{
"name": ""
},
{
"name": ""
}
]
}
- Создайте новый объект на основе ссылки. Используйте синтаксис распространения для копирования объекта. Затем отфильтруйте способ фильтрации
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);