如何通过比较对象中具有不同元素的两个对象数组来过滤数组?

时间:2018-05-25 18:50:18

标签: javascript arrays lodash javascript-objects

如何通过比较对象中具有不同元素的两个对象数组来过滤数组? 我有:

arr1 =[{ x: 1, y: 2, z:3 }, { x: 2, y: 1, z:4 }];

arr2 = [{ x: 1, y: 2, a:5 }, { x: 2, y: 3, a:4 }];

我想比较两个数组的x和y值,并从第一个数组返回非macthing对象,在上面的示例中返回[{ x: 2, y: 1, z:4 }] 我尝试使用_.differenceWith(arr1, arr2, _.isEqual);但显然这个数组应该有类似的对象,这不是我的情况。

2 个答案:

答案 0 :(得分:2)

你非常接近正确答案。 来自lodash的_.differenceWith函数有三个参数,要检查的数组,要排除的值和第三个参数是一个比较器,它确定您需要哪些值。在您的情况下,使用_.isEqual正在寻找完全相同的对象(据我所知,这不是您期望的行为)。

如果您只关心具有相同的xy值,请尝试使用自定义比较器而不是lodash中的_.isEqual函数。

它看起来像这样:

const arr1 = [{ x: 1, y: 2, z:3 }, { x: 2, y: 1, z:4 }];    
const arr2 = [{ x: 1, y: 2, a:5 }, { x: 2, y: 3, a:4 }];

// this is your custom comparator which is called with each value from the two arrays
// I gave descriptive names to the arguments so that it is more clear
const customComparator = (valueFromFirstArray, valueFromSecondArray) =>
  valueFromFirstArray.x === valueFromSecondArray.x
  && valueFromFirstArray.y === valueFromSecondArray.y;

const result = _.differenceWith(arr1, arr2, customComparator);

console.log(result);
// will print [{x: 2, y: 1, z: 4}]

或者如果您不熟悉箭头功能,可以像这样声明自定义比较器:

function customComparator(valueFromFirstArray, valueFromSecondArray) {
  return valueFromFirstArray.x === valueFromSecondArray.x
    && valueFromFirstArray.y === valueFromSecondArray.y
}

如果您愿意,可以在fiddle处与自定义比较器混合使用。

答案 1 :(得分:0)

使用filter function

arr1 =[{ x: 1, y: 2, z:3 }, { x: 2, y: 1, z:4 }];
arr2 = [{ x: 1, y: 2, a:5 }, { x: 2, y: 3, a:4 }];


let notMatched = arr2.filter(function (item, index) {
  return !(item.x === arr1[index].x && item.y == arr1[index].y);
});
console.log(notMatched);