JavaScript在数组内迭代数组的意外行为

JavaScript Unexpected Behaviour iterating arrays inside arrays

本文关键字:数组 意外 迭代 JavaScript      更新时间:2023-12-26

我正试图为一个基于ajax的web应用程序构建一个键/值关系。我决定使用纯基于数组的方法,因为迭代数组比objs更快(或者我听说是这样)。

这个想法的基础看起来是这样的:

var keyVals = [
    [ "key1", ["value1"] ],
    [ "key2", ["value2"] ],
];

然而,当我迭代数组以删除/设置或更改键时,事件并没有按预期运行:

例如:

console.log(keyVals);
function delKeyPair(key) {
    for (var i = 0; i < keyVals.length; i++) {
        if (keyVals[i][0] && keyVals[i][0] === key) {
            Array.prototype.splice.call(keyVals, i, 1);
            return true
        }
    }
    return false
};
delKeyPair("key1");
console.log(keyVals);

当我第一次console.log()数组时,它显示"key1已经被删除,在函数被调用之前。

这是一把小提琴,不太清楚发生了什么事。任何帮助都将不胜感激。http://jsfiddle.net/3pfj8927/

key1在调用函数之前尚未删除

尝试console.log(keyVals.length);

演示

输出:

Length before deleting: 2
Length after deleting: 1

控制台异步运行。它还保留了对对象的引用。

您的代码运行良好。

当您在控制台中查看对象时,它会显示它的当前外观,而不是日志时的样子。

如果用console.log(keyVals.slice());替换console.log(keyVals);,您应该看到正确的对象,因为我们按原样复制它们。

key1尚未删除。请注意,您正在处理给定数组的引用。如果您检查数组,它将由引用加载。因为您正在更改delKeyPair函数中的引用,所以似乎从来没有key1。

如果你在删除时复制数组,你会看到一切都像预期的那样。