【问题标题】:Why does "[[1, 2], [3, 4]].indexOf([1, 2])" return -1?为什么 "[[1, 2], [3, 4]].indexOf([1, 2])" 返回 -1?
【发布时间】:2016-12-27 17:30:53
【问题描述】:

我花了最后一个半小时试图在我的代码中找到一个错误,当我终于意识到这段 JavaScript 代码时:

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

返回 -1,即使诸如 [1, 2, 3].indexOf(1); 之类的东西正确返回 0...

为什么会发生这种情况,如何找到子数组的正确索引?

【问题讨论】:

标签: javascript arrays node.js indexof


【解决方案1】:

indexOf 只接受原始参数,您无法匹配:

[1, 2] == [1, 2]

这显然给了false

【讨论】:

  • indexOf 执行 === 而不是 ==。现在尝试向 OP 解释为什么[42, NaN].indexOf(NaN) 返回-1。 :D
  • @PraveenKumar indexOf 只接受原始参数a = [1, 2]; [a, [1, 2]].indexOf(a) // => 0
  • @PraveenKumar 参考? MDN 说:在 JavaScript 中,有 6 种原始数据类型:字符串、数字、布尔值、null、未定义、符号(ECMAScript 2015 中的新内容)。你会把我的 a 放在哪里?
  • @PraveenKumar String.prototype.indexOf != Array.prototype.indexOf
  • 您当然可以将任何值传递给Array#indexOf,而不仅仅是原始值。
【解决方案2】:

您可以迭代数组并检查模式的每个项目并返回索引。

function getIndexOf(array, pattern) {
    var index = -1;
    array.some(function (a, i) {
        if (a.length !== pattern.length) {
            return false;
        }
        if (a.every(function (b, j) { return b === pattern[j]; })) {
            index = i;
            return true;
        }
    });
    return index;
}

console.log(getIndexOf([[1, 2], [3, 4], [7, 8]], [7, 8]));

JSON 和indexOf 的另一种方式。

function getIndexOf(array, pattern) {
    return array.map(function (a) { return JSON.stringify(a); }).indexOf(JSON.stringify(pattern));
}

console.log(getIndexOf([[1, 2], [3, 4], [7, 8]], [7, 8]));

【讨论】:

  • 或者可以使用 a.join("") 而不是 JSON.stringify(a)
猜你喜欢
  • 1970-01-01
  • 2019-01-09
  • 2018-01-31
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2017-06-04
  • 1970-01-01
相关资源
最近更新 更多