【问题标题】:Check if an array includes an array in javascript检查数组是否包含javascript中的数组
【发布时间】:2020-10-11 10:39:47
【问题描述】:

javascript includes 函数可用于查找数组中是否存在元素。举个例子:

var arr = ['hello', 2, 4, [1, 2]];

console.log( arr.includes('hello') );
console.log( arr.includes(2) );

console.log( arr.includes(3) );

console.log( arr.includes([1, 2]) );

'hello'2 传递给函数会返回true,因为它们都存在于数组arr 中。

3 传递给函数会返回false,因为它不存在于数组中。

但是,为什么arr.includes([1, 2]) 也会返回false,即使这等于数组中的最后一个元素?如果这个方法不起作用,我还能如何找到我的数组是否包含项目[1, 2]

【问题讨论】:

标签: javascript arrays


【解决方案1】:

Array#includes 通过浅比较进行检查,因此在您的情况下,字符串和数字是原语,它们只有一个实例,因此您从Array#includes 获得true

但是当您检查数组时,您传递的是一个新的数组实例,该实例与您检查的数组中的实例不同,因此浅比较失败。

要检查一个数组是否包含在另一个数组中,首先检查它是否是一个数组,然后在数组之间进行深度比较。

  • 请注意,下面的 sn-p 仅适用于 基元数组

var arr = ['hello', 2, 4, [1, 2]];
const includesArray = (data, arr) => {
  return data.some(e => Array.isArray(e) && e.every((o, i) => Object.is(arr[i], o)));
}

console.log(includesArray(arr, [1, 2]));

但是,如果您保留对数组 [1, 2] 的引用并使用引用搜索 Array#includes,则在这种情况下,浅层比较可以完美地工作(服从 same value zero algorithm):

const child =  [1, 2];
const arr = ['hello', 2, 4, child];

console.log(arr.includes(child));

【讨论】:

    【解决方案2】:

    .includes() 方法使用sameValueZero equality 算法来确定一个元素是否存在于数组中。

    当被比较的两个值不是数字时,sameValueZero 算法使用SameValueNonNumber 算法。该算法由 8 个步骤组成,最后一步与您的代码相关,即在两个对象之间进行比较时。这一步是:

    1. 如果 x 和 y 是相同的 Object 值,则返回 true。否则,返回 false。

    所以在对象的情况下,SameValueZero 算法仅在两个对象相同时才返回 true。

    在您的代码中,由于arr 数组中的数组[1, 2] 与您传递给.includes() 方法的[1, 2] 完全相同,因此.includes() 方法无法找到arr 中的数组,并且作为结果返回false

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 2019-08-20
      • 2021-09-10
      相关资源
      最近更新 更多