簡體   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