Lodash比较不同长度的对象数组

时间:2019-10-10 15:39:47

标签: javascript arrays lodash

我正在使用lodash比较具有differentWith(isEqual)函数的objets的两个数组。

这是我的两个数组:

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 个答案:

答案 0 :(得分:1)

问题是代码_.isEqual中的比较器无法比较数组中的两个objects。您可以编写一个自定义比较器。

更简单的香草js选项可能是

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

此处过滤较大的数组以查找ID不在较小数组中的项目。

答案 1 :(得分:0)

您可以使用_.differenceBy。 _.intersection,用于在对象阵列的情况下与键进行比较。

.differenceBy .intersectionBy

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