我正在尝试为基于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/
答案 0 :(得分:1)
key1
:
尝试console.log(keyVals.length);
<强>输出:强>
Length before deleting: 2
Length after deleting: 1
答案 1 :(得分:0)
控制台异步运行。它还保留了对象的引用。
您的代码运行正常。
当您在控制台中查看对象时,它会显示当前的外观,而不是日志时的显示方式。
如果将console.log(keyVals);
替换为console.log(keyVals.slice());
,您应该看到正确的对象,因为我们按原样复制它们。
答案 2 :(得分:0)
key1尚未删除。请注意,您正在处理给定数组的引用。如果检查数组,它将被引用加载。因为您正在更改delKeyPair函数中的引用,所以似乎从未有过key1。
如果你在删除时复制数组,你会发现一切都像预期的那样。