我需要迭代一个键是非连续的数组:
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?感谢。
答案 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)
创建数组并在0
和3
处为其赋值时,会在undefined
和1
创建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