检查对象是否存在于另一个数组中

时间:2019-07-17 14:54:23

标签: typescript

我想检查一个数组中的对象是否存在于另一个数组中,因此对于以下示例,事件数组返回true,但event1数组返回false。

  

combination.some(a => event.every((v,i)=> v.code == a [i] .code))

let combination = [
  [
    { code: "repeatAdh", value: null },
    { code: "duplicatePartner", value: null }
  ]
];

let event = [
  { code: "repeatAdh", value: "Répéter adhérent par carte" },
  { code: "duplicatePartner", value: "Répéter conjoint" }
];

let event1 = [
  { code: "duplicatePartner", value: "Répéter conjoint" },
  { code: "repeatAdh", value: "Répéter adhérent par carte" }
];

2 个答案:

答案 0 :(得分:0)

JavaScript没有内置的方法可以比较不同对象的值。

当您比较2个对象时,Javascript将检查它们是否是“相同”对象,但不是通过值,而是通过标识。

例如,这两个对象不是同一对象。

const a = { foo: 'bar' };
const b = ( foo: 'bar' };

a === b // false

这两个相同:

const a = { foo: 'bar' };
const b = a;

a === b // true

在第二个示例中,如果您向a添加属性,则该属性也会显示在b上。

要按值比较两个对象 ,您需要遍历每个属性,看看它们是否都匹配。

答案 1 :(得分:0)

在JavaScript中检查对象之间的相等性非常棘手。没有内置功能可以给您直接的答案。因此,首先,您必须定义上下文中“等于”或“存在”的含义。

例如,如果您知道要检查的对象始终具有相同的键,则可以说,如果它们的值匹配,它们是相等的。给出你的例子

function isEqual(a, b) {
    return (
        a.code === b.code && a.value === b.value
    )
}

然后,您可以创建一个函数,该函数将检查列表中每个元素的相等性。

function listIsEqual(a, b) {
  return a.every(objA => 
    b.reduce((acc, objB) => 
      acc || isEqual(objA, objB)
    , false)
  );
}

您可以对照event来检查event1,这将返回true

listIsEqual(event, event1)
> true

您可以使用该函数检查event列表中是否存在events

function objIsInList(target, list) {
  return list.some(object => listIsEqual(target, object));
}

objIsInList(event, combination)
> false

objIsInList(event1, combination)
> false

objIsInList(combination[0], combination)
> true

但是,如果您的相等性检查更加复杂,则最好使用lodash之类的库提供的现有解决方案之一。 Lodash提供了一个名为isEqualisEqualDeep的函数,可以检查任何对象之间的相等性。 Here is its documentation

希望对您有帮助。