【问题标题】:Why can't I use Array#includes for a nested array?为什么我不能将 Array#includes 用于嵌套数组?
【发布时间】:2018-01-04 04:24:59
【问题描述】:

为什么下面一行在Javascript中返回false

 [[1,2,3], [1,2,4]].includes([1,2,3]);

这背后的基本逻辑是什么?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

includes 使用SameValueZero 相等算法进行比较。 (如developer.mozilla.org 中所述)。搜索对象时(数组也是对象),它只会匹配对同一对象的引用。

此外,Javascript 数组是对象,您不能简单地使用相等运算符== 来了解这些对象的内容 是否相同。相等运算符只会测试两个对象是否实际上是完全相同的实例(例如myObjVariable==myObjVariable,也适用于nullundefined)。

【讨论】:

    【解决方案2】:

    两个[1,2,3] 表达式都会创建一个新的数组对象。即使内容相同,对象本身也不同。

    例如看这个:

    const array1 = [1, 2, 3];
    const array2 = [1, 2, 3];
    
    console.log(array1 == array2); // false, different objects

    const array = [1, 2, 3];
    
    console.log(array == array); // true, same object

    【讨论】:

      【解决方案3】:

      .includes 检查数组中每个值的权益。在 JavaScript 中,具有相同值的两个数组是不等价的。有关详细信息,请参阅此线程:How to compare arrays in JavaScript?

      你可以这样做来检查一个数组是否包含一个数组。我使用 Lodash 进行权益比较,并使用 .some 属性来检查数组中的一个元素是否返回 true。

      console.log(
        [[1,2,3], [1,2,4]].some((array) => _.isEqual(array, [1,2,3]))
      )
      <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>

      【讨论】:

        【解决方案4】:

        因为它们是可变的。如果要检查数组,则需要按变量检查。

        var a = [1,2];
        var b = a;
         [a].includes(b);
        

        当您检查 [[1,2,]].includes([1,2,3]) 时,它返回 false,因为它们被视为两个不同的对象;即 [1,2] == [1,2] 返回 false。

        但是对于不可变的对象,比如stringnumber,可以直接查,比如

        ["a", "b"].includes("a")  //true
        [1, 2].includes(1) //true
        "a" == "a"   // true
        

        【讨论】:

          【解决方案5】:

          您可以只使用Array.some()(更准确地说是Array.prototype.some())方法,如下所示

          console.log([[1,2,3], [1,2,4]].some(e => e[0] === 1 && e[1] === 2 && e[2] === 3)); // would return 'true'
          console.log([[1,2,3], [1,2,4]].some(e => e[0] === 1 && e[1] === 2 && e[2] === 4)); // would return 'true'
          console.log([[1,2,3], [1,2,4]].some(e => e[0] === 1 && e[1] === 2 && e[2] === 5)); // would return 'false'

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-23
            • 1970-01-01
            • 2012-01-06
            • 2016-09-30
            • 2017-08-08
            • 2018-11-02
            • 1970-01-01
            相关资源
            最近更新 更多