[[1,2,3],[1,2,3]].includes([1,2,3])返回false

发布于 2022-09-03 19:43:38 字数 139 浏览 7 评论 0

我现在要对一个二维数组进行操作,如题,如果不存在就进行push操作,所以不是对已经存在的数组去重
试过indexOf,返回-1,es6的includes,返回false,
有什么原生的方法可以判断出来么,并且能解释一下为什么直接的includes不行么

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

同展鸳鸯锦 2022-09-10 19:43:38

数组是引用类型,所以 [1,2,3]===[1,2,3]false. 因此 indexOfincludes 自然判断不出来。
如果你数组内部是值类型的话可以

[[1, 2, 3], [1, 2, 3]].filter(function (arr) {
    return JSON.stringify(arr) === JSON.stringify([1, 2, 3]);
}).length;

如果这个值大于 0 说明包含这个待比较的数组。

Another update:

[[1, 2, 3], [1, 2, 3]].some(function (arr) {
    return JSON.stringify(arr) === JSON.stringify([1, 2, 3]);
});

这次返回 true 就说明包含待比较的数组。(灵感来自本题的另一个 answer)

美人骨 2022-09-10 19:43:38

因为includes在判断相等时如果是对象比较的是引用。想要成功你得这样:

或者:

var arr = [[1,2,3],[1,2,3]];

JSON.stringify(arr).includes([1,2,3].toString()) // 返回true

or

arr.toString().includes([1,2,3].toString()) // 返回true


要兼容的话可以这样:

var arr = [[1,2,3],[1,2,3]];

arr.some(function(v) {return v.toString() ===  [1,2,3].toString()}) // true

or

arr.toString().match([1,2,3].toString()).length > 0 // true
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文