Как сравнить два массива объектов и удалять элементы из 1-го массива только в том случае, если так указано в значении элемента 2-го массива

#javascript #arrays

#javascript #массивы

Вопрос:

Я пытаюсь создать новый массив объектов, сравнивая 2 существующих. Я хочу возвращать только элементы, которые передают оператор if.

Я хочу, чтобы это произошло: если имя элемента из addedArray совпадает с именем элемента из MainArray, А «добавленные» значения совпадают, затем верните элемент в новый массив, ИЛИ, если имена элементов не совпадают, добавьте элемент в новый массив в любом случае.

Если это не имеет смысла, пожалуйста, посмотрите на результат, который я хочу.

Вот что у меня есть прямо сейчас, и по какой-то причине в новом массиве все еще есть все элементы addedArray. Я не понимаю, почему.

 const mainArray = [
    {name: 'item1', added: false},
    {name: 'item2', added: true},
    {name: 'item3', added: false}
]
const addedArray = [
    {name: 'item2', added: true},
    {name: 'item3', added: true},
    {name: 'item5', added: true}
]



let newAddedArray = addedArray.filter((addedItem) => {
        return mainArray.map((mainItem) => {
            if ((addedItem.name === mainItem.name amp;amp; addedItem.added === mainItem.added) || addedItem.name !== mainItem.name) {
                return {
                    ...addedItem,
                    addedItem
                }
            }
        })
    })


// Result I want
// newAddedArray = [
//  {name: 'item2', added: true},
//  {name: 'item5', added: true}
// ] 

console.log(newAddedArray)  

Ответ №1:

Второе условие в OR выполняется для всех элементов в addedArray. Итак, вы видите все элементы в своем результате.

Из ожидаемого результата ясно, что вы пытаетесь пропустить любой элемент из MainArray, который имеет «добавленное» значение, не сравнимое с значением в addedArray. Попробуйте следующее

 addedArray.filter(function(addedItem){
    const itemFromMain = mainArray.find(function(mainItem){
        return mainItem.name === addedItem.name;
    });
    // If mainItem is found and 'added' matches or if mainItem is not found, accept it
    if(!itemFromMain || (itemFromMain amp;amp; itemFromMain.added === addedItem.added)) return true;
    return false;
});
  

Пожалуйста, обратите внимание, что метод «find» для массива не поддерживается в IE.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Редактировать: вы также можете использовать это условие для упрощения

 if(itemFromMain amp;amp; itemFromMain.added !== addedItem.added) return false;
return true;
  

Ответ №2:

Попробуйте, как показано ниже,

 let newAddedArray = [];
    mainArray.forEach((main) => {
        newAddedArray = addedArray.filter((added) => {
            return ((added.name === main.name amp;amp; added.added === main.added) || added.name !== main.name);
        });
    });

  

Ответ №3:

Вы можете использовать array .some для этого, изменив свою функцию фильтра:

 const mainArray = [
    {name: 'item1', added: false},
    {name: 'item2', added: true},
    {name: 'item3', added: false}
]
const addedArray = [
    {name: 'item2', added: true},
    {name: 'item3', added: true},
    {name: 'item5', added: true}
]


let newAddedArray = addedArray.filter(item => {
  const { name, added } = item;
  return mainArray.some(arr => arr.added amp;amp; added amp;amp; arr.name == name) || 
  !mainArray.some(arr => arr.name === name)
})

console.log(newAddedArray)