如何在数组数组中找到元素的索引?

时间:2015-10-05 17:10:14

标签: javascript arrays

这是一个包含至少一个其他数组的数组的简单示例。我想要一种方法来在数组中找到数组的索引。但是,我下面的代码不起作用:

var arr = [1,2,[1,2]];
console.log(arr.indexOf([1,2])); //-> -1

for (var i = 0; i < arr.length; i++) {
  if (arr[i] == [1,2])
    return 'true' // does not return true
}

直观地说,这应该有效但不是:

if ([1,2] == [1,2]) return 'true' // does not return true

有人可以解释为什么它不起作用,并提供替代解决方案?谢谢!

3 个答案:

答案 0 :(得分:1)

不,但你可以自己检查一下:

var a = [1,2], b = [1,2];

a.length === b.length && a.every(function(x,y) { return x === b[y]; });

答案 1 :(得分:0)

JavaScript中的数组通过引用而不是值进行比较。这就是为什么

console.log([1,2] == [1,2])

返回false

您需要一个可以比较数组的自定义函数。如果您只想检查第一级嵌套,可以使用以下代码:

var compareArrays = function(a, b) {
    if (a.length !== b.length) {
        return false;
    }

    for (var i = 0, len = a.length; i < len; i++) {
        if (a[i] !== b[i]) {
            return false;
        }
    }

    return true;
}

答案 2 :(得分:0)

您混淆类似对象与相同对象的定义。 Array.prototype.indexOf()使用strict equality comparison algorithm比较对象。对于(许多)对象,这意味着对象引用比较(即对象的唯一标识符,几乎与其内存地址一样)。

在上面的示例中,您尝试将两个相似的数组视为相同的数组,这就是它不起作用的原因。要执行您要执行的操作,您需要使用相同的数组。像这样:

var testArr = [1,2]; //a specific object with a specific reference
var arr = [1,2,testArr]; //the same array, not a different but similar array
console.log(arr.indexOf(testArr)); //returns 2

如果您只想知道父数组中数组的位置,请使用Array.isArray()

...
if(Array.isArray(arr[i])) {
    //do something
}
...

希望这有帮助!