[英]Javascript iterating through sparse array
我有一個稀疏數組(索引不連續),如下所示:
var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };
我只想迭代每個項目,做一些事情,並能夠在一定條件下休息。
我是Javascript的新手,我找不到合適的方法。 這是我嘗試過的:
內置“for..in”。 看來這不是迭代數組的正確方法
來自ECMASCRIPT5的forEach 。 這個迭代正確,但我無法擺脫循環。
來自Underscore.js的_.each() 。 與#2相同的結果。
來自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.