[英]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
,也适用于null
和undefined
)。
[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>
您可以仅使用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.