繁体   English   中英

Javascript迭代稀疏数组

[英]Javascript iterating through sparse array

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

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

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

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

  1. 内置“for..in”。 看来这不是迭代数组的正确方法

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

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

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

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

谢谢!

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;
  }
}

For..in在处理对象哈希时并不是最糟糕的事情。 要避免使用数组( [] ),但这里应该没问题:

var val;
for (index in testArray) {
  if (index == 10) {
    break;
  } else {
    val = testArray[index];
  }
}

你要亲吻的第一件事是“阵列”。 ECMAscript中没有真正的Array (忘记了类型数组和二进制技巧)。

所以你得到的是一个普通的Object 为了迭代它,如果你对ES5很酷,我建议使用.forEach 如果您需要提前中断该迭代,您可能需要使用ES5方法,如.some().every() ,如:

Object.keys( testArray ).some(function( key ) {
    if( +key < 15 ) {            
        return true;
    }

    console.log(key, testArray[key]);
});

当遇到一个数值不低于15的键时,这将通过返回true来中断迭代。

你拥有的不是一个数组,它只是一个对象。

你可以测试:

Array.isArray(testArray)

对于什么是值得的,JavaScript确实有一个据说稀疏的数组。 当您使用delete运算符删除元素或将length属性更改为更大时,会发生这种情况。

要回答你的问题,要通过一个对象循环,最好的方法是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,并且它没有任何可枚举的属性。

您也可以使用(滥用) 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 这可以让你早点摆脱循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM