首页 > 解决方案 > 通过比较具有不同元素的两个对象数组来过滤和删除项目

问题描述

我有两个数组

arr1 = [{path: "path1"}, {path: "path2"}];
arr2 = [{path: "path1"}];

首先,我想通过比较两个数组并操作第一个数组或通过删除该项来覆盖它来找到从 arr1 中删除的元素(在本例中为它的 path1 对象)。在这种情况下,预期的数组是

expArray = [{path: "path2"}]

我尝试过使用array.filter方法。

var filteredElements = arr1 .filter(function(obj) {
    return !arr2 .some(function(obj2) {
        return obj.Path === obj2.Path;
    });    
});

但它只给出不同的元素列表,但不支持从数组中删除元素。有没有办法使用下划线或传统方式做到这一点?

标签: javascriptunderscore.js

解决方案


你有一个错字Pathvs path。该代码适用于此更改。

var arr1 = [{ path: "path1" }, { path: "path2" }],
    arr2 = [{ path: "path1" }],
    filteredElements = arr1.filter(function(obj) {
        return !arr2.some(function(obj2) {
            return obj.path === obj2.path;
            //         ^             ^
        });
    });
    
console.log(filteredElements);

如果你喜欢变异arr1,你可以拼接不需要的元素,因为这会改变长度,你可以从最后迭代。

var arr1 = [{ path: "path1" }, { path: "path2" }],
    arr2 = [{ path: "path1" }],
    i = arr1.length;

while (i--) {
    if (arr2.some(({ path }) => arr1[i].path === path)) {
        arr1.splice(i, 1);
    }
}

console.log(arr1);


推荐阅读