繁体   English   中英

为什么不能将 Array#includes 用于嵌套数组?

[英]Why can't I use Array#includes for a nested array?

为什么以下行在 Javascript 中返回false

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

这背后的底层逻辑是什么?

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

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

[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

.includes检查数组中每个值的权益。 在 JavaScript 中,具有相同值的两个数组是不等价的。 有关更多详细信息,请参阅此线程: 如何比较 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>

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

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

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

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

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

您可以仅使用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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM