我有一个稀疏数组(索引不连续),如下所示:
var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };
我只想迭代每个项目,做一些事情,并能够在一定条件下休息。
我是Javascript的新手,我找不到合适的方法。这是我试过的:
内置“for..in”。这似乎是not the correct way to iterate through an array
forEach。这个迭代正确,但我无法摆脱循环。
_.each()。与#2相同的结果。
$.each()。有了这个,我可以通过返回false来打破,但它不会正确迭代。对于上面的例子,不是迭代0,5,10,15,而是迭代0,1,2,3,4,5,6 ......这显然不是我所期望的。
< / LI> 醇>所以我的问题是:是否有一种简单的方法来迭代稀疏数组,有可能在Javascript循环期间中断或者更好地使用其他数据结构如哈希表?如果有,任何推荐?
谢谢!
答案 0 :(得分:10)
for...in
语法有什么问题?您有一个对象,因此for...in
语法完全有效:
var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };
for (var key in testArray) {
var value = testArray[key];
if (...) {
break;
}
}
答案 1 :(得分:3)
For..in在处理对象哈希时并不是最糟糕的事情。要避免使用数组([]
),但这里应该没问题:
var val;
for (index in testArray) {
if (index == 10) {
break;
} else {
val = testArray[index];
}
}
答案 2 :(得分:3)
你必须亲吻再见的第一件事是“阵列”。 ECMAscript中没有真正的Array
(忘记了类型数组和二进制技巧)。
所以你得到的是一个简单的Object
。为了重复这一点,如果你对ES5很酷,我建议使用.forEach
。如果您需要提前中断该迭代,则可能需要使用.some()
或.every()
等ES5方法,例如:
Object.keys( testArray ).some(function( key ) {
if( +key < 15 ) {
return true;
}
console.log(key, testArray[key]);
});
通过返回true
,当遇到数值不低于15的键时,这将中断迭代。
答案 3 :(得分:2)
你拥有的不是数组,它只是一个对象。
您可以通过以下方式进行测试:
Array.isArray(testArray)
对于什么是值得的,JavaScript确实有一些据称稀疏的数组。当您使用delete
运算符删除元素或将长度属性更改为更大时,会发生这种情况。
要回答您的问题,要通过对象循环,最好的方法是Object.keys(obj).forEach()
。
var o = {"a":3, "b":4};
Object.keys(o).forEach(
function (key) {
var val = o[key];
console.log("Key:" + key);
console.log("Value:" + val);
}
);
可能存在的问题
for (var p in o) {…}
是它也将循环通过父级中的任何可枚举属性(即原型链)。通常情况下,如果你通过文字表达式var obj = {...}
定义对象,它默认情况下它的父对象是Object.prototype,并且它没有任何可枚举的属性,它通常不会发生。
答案 4 :(得分:0)
您也可以使用(滥用)Array.every
而不是Array.fromEach
来尽早退出循环。
var pre = document.getElementById('console');
var arr = new Array();
arr[10] = 'Hello';
arr[20] = 'World!';
arr[30] = 'stop';
arr[40] = 'Goodbye';
arr.every(function (val, idx) {
if (val !== 'stop') {
pre.textContent += idx+': '+val+'\n';
return true;
}
});
<pre id="console"></pre>
基本上,Array.every
会在其元素之一返回false
时立即返回false
。这样一来,您就可以早日摆脱循环。