如何通过比较对象中具有不同元素的两个对象数组来过滤数组? 我有:
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);
但显然这个数组应该有类似的对象,这不是我的情况。
答案 0 :(得分:2)
你非常接近正确答案。
来自lodash的_.differenceWith
函数有三个参数,要检查的数组,要排除的值和第三个参数是一个比较器,它确定您需要哪些值。在您的情况下,使用_.isEqual
正在寻找完全相同的对象(据我所知,这不是您期望的行为)。
如果您只关心具有相同的x
和y
值,请尝试使用自定义比较器而不是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)
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);