Home  >  Q&A  >  body text

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

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

黄舟黄舟2654 days ago384

reply all(2)I'll reply

  • 高洛峰

    高洛峰2017-04-11 13:07:08

    数组是引用类型,所以 [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)

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-11 13:07:08

    因为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
    

    reply
    0
  • Cancelreply