Удалить или pu sh, если массив значений существует в другом массиве объектов в ES6, Javascript - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть и массив объектов с подробной информацией об определенной еде:

let food = [
    {id: 1, name: 'Peas', comments: ''},
    {id: 2, name: 'Oranges', comments: ''},
    {id: 3, name: 'Bananas', comments: ''},
    {id: 4, name: 'Grapefruits', comments: ''},
    {id: 5, name: 'Apples', comments: ''}
];

Второй массив включает в себя все выбранные идентификаторы еды, которые пользователь может выбрать в выпадающем списке с несколькими вариантами:

let selectedFood = [1, 5];

, а в третьем массиве я хочу добавить / удалить элементы на основе идентификаторов selectedFood - прямо сейчас он должен включать идентификаторы 1 и 5:

let newFood = [
   {id: 1, name: 'Peas'},
   {id: 5, name: 'Apples'}
]

Если мы выберем новая еда, скажем, Bananas, тогда массив selectedFood должен выглядеть так:

let selectedFood = [1, 5, 3];

... и массив newFood:

let newFood = [
   {id: 1, name: 'Peas'},
   {id: 5, name: 'Apples'},
   {id: 3, name: 'Bananas'}
]

Если мы хотим удалить скажем, элемент Peas из выбранной еды должен удалить его из массивов selectedFood и newFood:

let selectedFood = [5, 3];

let newFood = [
   {id: 5, name: 'Apples'},
   {id: 3, name: 'Bananas'}
]

Есть ли какой-нибудь быстрый и простой способ сделать это? Я знаю, что могу сделать forEach на selectedFood и найти / отфильтровать на newFood, а затем нажать / соединить на основе результата. Однако существует ли простой способ ES6 добиться этого?

Обновление № 1:

Одна вещь, которую я забыл упомянуть, - я хочу сохранить текущий массив вместо создания нового. Причина в том, что я могу изменить / добавить некоторые другие значения перед удалением / добавлением элемента.

1 Ответ

2 голосов
/ 14 апреля 2020

Использование .filter() и .includes():

let food = [
    {id: 1, name: 'Peas', comments: ''},
    {id: 2, name: 'Oranges', comments: ''},
    {id: 3, name: 'Bananas', comments: ''},
    {id: 4, name: 'Grapefruits', comments: ''},
    {id: 5, name: 'Apples', comments: ''}
];

let selectedFood = [1, 5, 3];

const result = food.filter(e => selectedFood.includes(e.id));

console.log(result);

Если вам нужны только поля id и name, то в конце вы можете использовать .map().

Надеюсь, это поможет!

...