Javascript:使用非连续键在数组上迭代
我需要迭代一个键不连续的数组:Javascript:使用非连续键在数组上迭代,javascript,jquery,oop,iterator,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 th
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(var i=0;i惯用的方法是使用对象,而不是数组。只需确保检查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,请确保使用Babel传输该代码。您可以忽略未定义的属性
for(var i in messages)
{
console.log(messages[i]);
}
for (var i=0 ; i<messages.length ; i++) {
if(messages[i] !== undefined)
alert(messages[i]);
}
messages.forEach(function(v,i) {
alert(v);
});
您可以使用each()
jQuery方法来执行此操作
$.each(messages, function(index, val){
alert(val);
});
来自jQuery文档
each()
通用迭代器函数,可用于无缝迭代
在对象和数组上。具有
对length属性(例如函数的arguments对象)进行迭代
通过数值索引,从0到长度-1。其他对象通过
它们的命名属性
创建数组并在0
和3
处为其赋值时,将在1
和2
处创建未定义的值。请尝试以下操作:
$.each(messages, function(i,val) {
if (val) {
alert(val);
}
});
简单!如果数组在索引之间有规则间隙,请执行以下操作:
for (var i = 0 ; i < messages.length; i += gap) {
alert(messages[i]); // Will only alert the messages at the regular interval/gap
}
for(变量i=0;i
对于具有以下假设的用例:
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
var数组=[“你”、“将”、“成为”、“强大”、“与”、“代码”、“学徒”];
var值=[1,5,7];
对于(变量i=0;i
或者是更有意义的事情,比如:
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
for(变量i=0;i
你最初是如何得到这样一个数组的?与其寻找一些黑客来迭代它,不如从它的根开始解决这个问题=>这就是你获得这个数组的方式。你考虑过使用对象吗?{“0”:“这是第一条消息”,“3”:“这是另一条消息”}
只会提醒第一条消息,因为i永远不等于3,这是不正确的。消息。长度将为4
。数组表示对象,而不是示例中的简单字符串文本。数组键是数据库主键。将主键作为对象的另一个属性会导致各种复杂情况因为我通常知道通过ID访问哪个对象,所以使用ID作为数组键是非常方便的。也就是说,除了这个问题。@Yoshi:你是对的,循环必须抛出一个异常并在遇到无效数组键时退出。无论哪种方式,该方法都不起作用!是“jQuery”真的是简单枚举的最佳解决方案吗?@ShankarSangoli,您会发现$。每个(消息,函数(索引,val){
都比for(消息中的var i){
简单。我想我们对简单性有不同的定义。我认为使用基本语言构造“for
”比使用jQuery更干净、更简单。每个jQuery
。因为jQuery
将索引和值作为回调参数分开,您不必维护变量。如果性能是个问题,我肯定会使用for
或forEach
的经典JavaScript方法“jQuery”真的是简单枚举的最佳解决方案吗?这取决于你认为什么是“最好的”。对于学习JavaScript并能访问jQuery的人来说,使用jQuery每个都可以避免使用for循环时发现的其他常见问题而不知道它们是如何工作的。如果你所看到的都是“最快的”。",最好不要使用javascript库,对吗?@Matt-这里真正的答案是,当您创建一个值为0
和3
的数组时,1
和2
的索引会被填充和迭代。他的原始代码会提醒所有消息。您如何迭代它们并不重要创建一个值为0和3的数组,1或2处没有元素。不是1和2处的元素包含未定义的值。
。索引1和2处根本没有元素。在JavaScript控制台中尝试此操作:var a=[1];a[3]=1;console.log(a中的1);
…压缩hasOwnProperty()
check会增加这个答案的吸引力。为什么不直接调用消息上的hasOwnProperty
?if(messages.hasOwnProperty(i)){alert(messages(i));}
@meouw-这只是一个额外的安全措施,虽然可能是不必要的预防措施,以防止消息定义了名为hasOwnProperty的属性或函数的可能性很小.hasOwnProperty.call
确保您始终获得object.prototypeOK-我认为这会让问题变得有点模糊。您的答案可能不太清楚,因为您不仅解决了OP的问题,而且还解决了另一个问题。感谢您回答这个问题,这仍然让我对堆栈社区中的一些人感到困惑决定开始问一些不相关的问题或说你的错,但却不能给你很好的理由。ohhh-+1 for forEach-不知道忽略了未定义的属性。forEach
并没有在IE<9中实现。@Tim-是的……我想我只是(通常)有点奢侈