【问题标题】:How to filter array by comparing two arrays of objects with different elements in their objects?如何通过比较对象中具有不同元素的两个对象数组来过滤数组?
【发布时间】:2018-11-05 05:03:23
【问题描述】:

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

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

【问题讨论】:

  • 我不明白返回 [{ x: 2, y: 1, z:4 }] 的数学逻辑。 z: 3 不也不同吗?
  • @andrewL,我只想返回无法匹配两个元素 x 和 y 的整个对象
  • 但是返回数组x:2中的第一项在两个数组中都有匹配的元素。
  • x 和 y 都必须匹配

标签: javascript arrays lodash javascript-objects


【解决方案1】:

您非常接近正确答案。 来自 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,如果您愿意,可以在其中与自定义比较器混在一起。

【讨论】:

    【解决方案2】:

    使用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);
    

    【讨论】:

    • 您好,Flash,谢谢。但唯一的问题是数组长度不相等,因此这将失败,并且两个数组的数组长度不固定并且可以变化。
    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    相关资源
    最近更新 更多