代码之家  ›  专栏  ›  技术社区  ›  alex

如何根据javascript中的值检查对象是否在数组中?

  •  3
  • alex  · 技术社区  · 8 年前

    例如,如何检查 array2 存在于 array1 基于他们 id ?

    const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }]
    const array2 = [{ id: 1 }, { id: 2 }]
    

    不知什么原因,我在谷歌上找不到解决方案。

    我想了想:

    const result = array1.every(obj1 => {
      // what do use here? includes? contains?
    })
    
    console.log(result)
    

    但我有点被困在密码中间了。对我来说最合理的解决办法是 includes . 然而, 包括 似乎没有什么作用: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes . 所以我不确定我能不能用身份证检查这些东西。

    5 回复  |  直到 8 年前
        1
  •  2
  •   Robby Cornelissen    8 年前

    像这样,用 Array.prototype.every 结合 Array.prototype.some() :

    const result = array2.every(o2 => array1.some(o1 => o1.id === o2.id));
    

    这将检查 array2 中有匹配的元素 array1 .


    以下是完整的片段:

    const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }];
    const array2 = [{ id: 1 }, { id: 2 }];
    
    const result = array2.every(o2 => array1.some(o1 => o1.id === o2.id));
    
    console.log(result);

    如果 ARARY1 是大型的,或重复用于执行此操作的 Set 在其他答案中提出的方法是更优化的。

        2
  •  4
  •   CertainPerformance    8 年前

    includes 如果两个对象在内存中都是相同的引用,那么这可能是正确的,(可能)不是这样。相反,我会创建一个 Set 属于 array1 的 id 一开始,然后检查 array2 身份证件 在布景里。这样,您只需遍历 ARARY1 一次,一开始( 集合 有 O(1) 查找时间):

    const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }];
    const array2 = [{ id: 1 }, { id: 2 }];
    
    const idSet = new Set(array1.map(({ id }) => id));
    console.log(
      array2.every(({ id }) => idSet.has(id))
    );

    (数组没有 contains 函数

        3
  •  3
  •   Snezhana    8 年前
    var matching = [];
    
    for (var j = 0; j < array1.length; j++) {
        for (var i = 0; i < array2.length; i++) {
            if (array2[i].id === array1[j].id) {
                matching.push(array2[i].id);       
            }
        }
    }
    
    if (array2.length === matching.length) {
        console.log("All elements exist");
    } else {
        console.log("One or more of the elements does not exist");
    }
    
        4
  •  2
  •   Karan    8 年前

    类似的问题已经提出了。你也可以在这个链接上看到 Check if every element in one array is in a second array

    const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }];
    const array2 = [{ id: 1 }, { id: 2 }];
    
    let array1ids = array1.map(a => a.id);
    const result = array2.every(a => array1ids.includes(a.id));
    console.log(result);
    
    const array3 = [{ id: 1 }, { id: 2 }, { id: 3 }];
    const array4 = [{ id: 1 }, { id: 6 }];
    
    let array3ids = array3.map(a => a.id);
    const result2 = array4.every(a => array3ids.includes(a.id));
    console.log(result2);
        5
  •  1
  •   Patrick Roberts Benjamin Gruenbaum    8 年前

    对于大型数组,我建议对用作数组的标准进行预处理,以创建一个数组。 Set 因此,每个检查是O(1)查找和全局O(n)而不是O(n ^ 2)。不过,这段代码有几个假设,即:

    • 标准基于 select() 功能 object 它的 index 在数组中,引用 array .
    • 用作条件的选择返回一个基元,并且可以执行与 集合 使用 a === b || (a !== a && b !== b) (处理 a 和 b 存在 NaN )

    const has = select => array => {
      const set = new Set(array.map(select))
      return (object, index, array) => set.has(select(object, index, array))
    }
    
    const hasId = has(({ id }) => id)
    const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }]
    const array2 = [{ id: 1 }, { id: 2 }]
    
    const result1 = array1.every(hasId(array2))
    const result2 = array2.every(hasId(array1))
    
    console.log(result1)
    console.log(result2)