Javascript:使用非连续键迭代数组

时间:2012-01-30 15:43:20

标签: javascript jquery oop iterator

我需要迭代一个键是非连续的数组:

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
}

处理这个问题的规范方法是什么,看作the for-each syntax is not intended for iterating over values in an array in javascript?感谢。

7 个答案:

答案 0 :(得分:10)

惯用的方法是使用对象,而不是数组。请务必检查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进行转换。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

您可以忽略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);
});

答案 3 :(得分:2)

简单!如果数组在索引之间有规律的间隙,请执行以下操作:

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

答案 4 :(得分:1)

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

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

来自jQuery docs

each()

  

通用迭代器函数,可用于无缝迭代   对象和数组。数组和数组类似的对象   重复长度属性(例如函数的参数对象)   按数字索引,从0到长度-1。其他对象通过迭代   他们的命名属性。

答案 5 :(得分:1)

创建数组并在03处为其赋值时,会在undefined1创建2个值。试试这个:

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

答案 6 :(得分:0)

对于具有以下假设的用例:

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