Javascript迭代稀疏数组

时间:2012-05-13 03:27:05

标签: javascript arrays

我有一个稀疏数组(索引不连续),如下所示:

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };

我只想迭代每个项目,做一些事情,并能够在一定条件下休息。

我是Javascript的新手,我找不到合适的方法。这是我试过的:

  1. 内置“for..in”。这似乎是not the correct way to iterate through an array

  2. 来自ECMASCRIPT5的
  3. forEach。这个迭代正确,但我无法摆脱循环。

  4. 来自Underscore.js的
  5. _.each()。与#2相同的结果。

  6. 来自JQuery的
  7. $.each()。有了这个,我可以通过返回false来打破,但它不会正确迭代。对于上面的例子,不是迭代0,5,10,15,而是迭代0,1,2,3,4,5,6 ......这显然不是我所期望的。

    < / LI>

    所以我的问题是:是否有一种简单的方法来迭代稀疏数组,有可能在Javascript循环期间中断或者更好地使用其他数据结构如哈希表?如果有,任何推荐?

    谢谢!

5 个答案:

答案 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。这样一来,您就可以早日摆脱循环。