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

时间:2015-02-18 11:58:50

标签: javascript arrays loops

我正在尝试为基于ajax的网络应用构建关键/价值关系。我决定使用纯数组方法,因为迭代数组比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()数组时 - 它显示&#34; key1已被删除,在调用该函数之前。

这是一个小提琴,不太清楚发生了什么。任何帮助深表感谢。 http://jsfiddle.net/3pfj8927/

3 个答案:

答案 0 :(得分:1)

在调用函数之前尚未删除

key1

尝试console.log(keyVals.length);

DEMO

<强>输出:

Length before deleting: 2
Length after deleting: 1

答案 1 :(得分:0)

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

您的代码运行正常。

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

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

答案 2 :(得分:0)

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

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