簡體   English   中英

Javascript:使用非連續鍵迭代數組

[英]Javascript: Iterating over array with non-consecutive keys

我需要迭代一個非連續鍵的數組:

var messages = new Array();
messages[0] = "This is the first message";
messages[3] = "This is another message";

顯然使用for循環的索引將不起作用,因為它取決於順序的鍵:

for (var i=0 ; i<messages.length ; i++) {
    alert(messages[i]); // Will only alert the first message, as i is never equal to 3
}

什么是處理這個的規范方法,因為for-each語法不是用於在javascript中迭代數組中的值 謝謝。

慣用的方法是使用一個對象,而不是一個數組。 請務必檢查hasOwnProperty以確保您不會拾取可能已添加到原型中的雜散物品。

var messages = { };
messages[0] = "This is the first message";
messages[3] = "This is another message";

for (var i in messages) {
    if (messages.hasOwnProperty(i))
        alert(messages[i]); 
}

或者,更現代的方式是使用Object.keys

Object.keys(messages).forEach(prop => {
    alert(messages[prop]);
});

如果您計划在IE等舊版瀏覽器中運行它,請務必使用Babel來傳輸該代碼。

for(var i in messages)
{
    console.log(messages[i]);
}

你可以忽略undefined屬性......

for (var i=0 ; i<messages.length ; i++) {
    if(messages[i] !== undefined)
        alert(messages[i]);
}

或者使用forEach ,它將忽略undefined未聲明屬性...

messages.forEach(function(v,i) {
    alert(v);
});

簡單! 如果數組在索引之間有規律的間隙,請執行以下操作:

for (var i = 0 ; i < messages.length; i += gap) {
    alert(messages[i]); // Will only alert the messages at the regular interval/gap 
}

您可以使用each() jQuery方法來執行此操作。

$.each(messages, function(index, val){
    alert(val); 
});

來自jQuery文檔

each()

通用迭代器函數,可用於無縫迭代對象和數組。 具有length屬性的數組和類似數組的對象(例如函數的參數對象)由數字索引迭代,從0到length-1。 其他對象通過其命名屬性進行迭代。

創建數組並將其undefined03 ,將在12處創建undefined值。 試試這個:

$.each(messages, function(i,val) { 
  if (val) {
    alert(val);
  } 
});

對於具有以下假設的用例:

array.length >== 1 (即:已包含有意義數據的數組)

您對array[1], array[15], array[45]等數據感興趣的地方

你可以做類似的事情:

var array = ["you","will","become","strong","with","the","codes","padawan"];
var values = [1,5,7];


for (var i = 0; i < values.length; i++){
    var cypher = values[i];
    console.log(array[cypher]);
}
//will, the, padawan

或許更有意義的事情,例如:

for (var i = 0; i < values.length; i++){
    var cypher = values[i];
    aService.aFn.(array[cypher],cb);
}
//calls aService.aFn separately for each value array[1] , array[5] , array[7] passed as args

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM