Лодаш сравнить массив объектов разной длины - PullRequest
0 голосов
/ 10 октября 2019

Я использую lodash для сравнения двух массивов объектов с функцией DifferentWith (isEqual).

Вот мои два массива:

array1

[
    {
        "id":"28884",
        "designation":"French fries",
        "description":"French fries",
        "prices":[ 
            { 
            "price":0,
            "vat":2821
            }
        ]
    },
    {
        "id":"28885",
        "designation":"Potatoes",
        "description":"Potatoes",
        "prices":[ 
            { 
            "price":0,
            "vat":2821
            }
        ]
    }
]

array2

[
    {
        "id":"28884",
        "designation":"French fries",
        "description":"French fries",
        "prices":[ 
            { 
            "price":0,
            "vat":2821
            }
        ]
    },
    {
        "id":"28885",
        "designation":"Potatoes",
        "description":"Potatoes",
        "prices":[ 
            { 
            "price":0,
            "vat":2821
            }
        ]
    },
    {
        "id":"30157",
        "designation":"new item",
        "description":null,
        "prices":[ 
            { 
                "price":500,
                "vat":2821
            }
        ]
    }
]

Вот что я сделал, но это не работает:

const toAdd = _.differenceWith(array1, array2, _.isEqual);
const toRemove = _.differenceWith(array2, array1, _.isEqual);

Как получить удаленные элементы? Кроме того, как я могу получить новые элементы, удаленные элементы с помощью lodash? Спасибо!

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Проблема в том, что компаратор в коде _.isEqual не может сравнить два objects в массиве. Вы можете написать собственный компаратор.

Более простой вариант vanilla js может быть

removedObjectsArray = array2.filter(item => !array1.map(obj => obj.id).includes(item.id));

Здесь массив большего размера фильтруется, чтобы найти элементы с идентификатором, которого нет в меньшем массиве.

0 голосов
/ 10 октября 2019

Вы можете использовать _.differenceBy. _.intersectionBy для сравнения с ключом в случае массива объектов.

.differenceBy .intersectionBy

 let toRemove = _.differenceBy(array2, array1, 'id');
 let toAdd = _.intersectionBy(array1, array2, 'id');
...