【问题标题】:Compare arrays in JavaScript比较 JavaScript 中的数组
【发布时间】:2014-01-15 15:06:47
【问题描述】:

我正在尝试找出一种方法来比较 JavaScript 中的数组,特别是在 node.js 中。

我有 2 个数组:

Arr1:

[16,31,34,22,64,57,24,74,7,39,72,6,42,41,40,30,10,55,23,32,11,37,4,3,2,52,1,17,50,56,60,65,48,43,58,28,36,47,69,27,8,59,70,26,62,54,53,5,19,73]

Arr2

[12,11,9,14,7]

这个想法是检查 Arr2 中的值是否存在于 Arr1 中,如果存在,则返回 true;有什么想法吗?

【问题讨论】:

    标签: javascript arrays node.js express logic


    【解决方案1】:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every

    Arr2.every( function( element ){ return Arr1.indexOf( element ) > - 1 })
    

    编辑 2019:ES6 和 Array.prototype.includes

    Arr2.every( elm => Arr1.includes( elm ) )
    

    在 cmets @Pablo 中指出,如果数组包含对象,这将不起作用。这不完全正确,让我解释一下。

    const ob1 = { foo: 1 }
    const ob2 = { bar: 2 }
    const ob3 = { baz: 3 }
    
    const Arr1 = [ ob1, ob2, ob3 ];
    const Arr2 = [ ob1, ob3 ];
    
    Arr2.every( elm => Arr1.includes( elm ) ); // true, the same objects
    
    const Arr3 = [ { foo: 1 }, { bar: 2 }, { baz: 3 } ]
    const Arr4 = [ { foo: 1 }, { baz: 3 } ]
    
    Arr4.every( elm => Arr3.includes( elm ) ); // false, distinct objects of the same "shape"
    

    对于 JS 开发人员来说,以上任何一种情况都不应该让他们感到意外,我会说这是预期的结果。如果您想通过键和值来比较对象的相同性,那么您可以先将它们映射到 JSON 字符串:

    const Arr3json = Arr3.map( elm => JSON.stringify( elm ) );
    const Arr4json = Arr4.map( elm => JSON.stringify( elm ) );
    
    Arr4json.every( elm => Arr3json.includes( elm ) );  // true, comparing string representations of distinct objects
    

    【讨论】:

    • 噢!我忘了everysome 有效,但every 更清晰。
    • 请注意,这是 O(n*m)。
    • 很好的解决方案,我之前从未尝试过 .every(),感谢您的建议。
    • 请注意,如果数组中的至少一个元素是对象,则此代码不起作用,因为对象是通过引用而不是值进行比较的。所以对象只等于自己,如果比较两个独立的对象,无论两个对象的属性和值是否相同,结果都会为假。
    • @Pablo 它确实适用于对象,问题是它是否是预期的结果。请参阅编辑后的答案以获取解释:)
    【解决方案2】:

    您可以编写自己的函数来执行此操作:

    var arr1 = [16,31,34,22,64,57,24];
    var arr2 = [16,34,64,24];
    var index;
    
    for (var i = 0; i < arr2.length; i++) 
    {
        index = arr1.indexOf(arr2[i]);
        if (index > -1) 
        {
            arr1.splice(index, 1);        
        }
    }
    

    这只是一个帮助。从这里您可以尝试自己完成您的程序。

    【讨论】:

      【解决方案3】:

      请注意,如果数组的元素是对象,则此代码和 @pawel 代码不起作用, 因为对象是通过引用而不是值进行比较的。所以对象只等于自己,不管两个对象的属性和值是否相同。

      我建议改进@pawel 答案。

      const Arr1 =  [16,31,34,22,64,57,24,74,7,39,72,6,42,41,40,30,10,55,23,32,11,37,4,3,2,52,1,17,50,56,60,65,48,43,58,28,36,47,69,27,8,59,70,26,62,54,53,5,19,73]
      const Arr2 = [12,11,9,14,7]
      
      const elementsInArr2ExistOnArr1 = Arr2.every( ( element ) => Arr1.includes(element))
      
      console.log(`Elements in Arr2 exists on Arr1? ${elementsInArr2ExistOnArr1}`)
      
      // Proof code works when elements are the same in both arrays
      
      const Arr3 = [7,14,11,9,12]
      
      const elementsInArr3ExistOnArr2 = Arr3.every( ( element ) => Arr2.includes(element))
      
      console.log(`Elements in Arr3 existe on Arr2? ${elementsInArr3ExistOnArr2}`)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2022-01-21
        相关资源
        最近更新 更多