【问题标题】:check if an object exist into another array检查一个对象是否存在于另一个数组中
【发布时间】:2019-11-26 11:01:29
【问题描述】:

我想检查一个数组中的一个对象是否存在于另一个数组中,所以对于下面的例子,event数组返回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" }
];

【问题讨论】:

    标签: typescript


    【解决方案1】:

    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 上。

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

    【讨论】:

      【解决方案2】:

      在 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)
        );
      }
      

      您可以检查eventevent1,这将返回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

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 2016-06-05
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        相关资源
        最近更新 更多