警告: 问题仍然适用于循环的for…不要使用for…in来迭代数组,而是使用它来迭代 对象的属性。也就是说,这个


我知道JavaScript语法中的基本for是这样的:

for (var obj in myArray) {
    // ...
}

但是我如何得到循环计数器/索引?

我知道我可能会这样做:

var i = 0;
for (var obj in myArray) {
    alert(i)
    i++
}

或者甚至是美好的老故事:

for (var i = 0; i < myArray.length; i++) {
    var obj = myArray[i]
    alert(i)
}

但我宁愿使用更简单的for-in循环。我认为它们看起来更好,更有意义。

有没有更简单或更优雅的方式?


在Python中,这很简单:

for i, obj in enumerate(myArray):
    print i

当前回答

在ES6中,使用for…的循环。 你可以在…就像这样

for (let [index, val] of array.entries()) {
  // your code goes here    
}

注意,Array.entries()返回一个迭代器,这使得它可以在for-of循环中工作;不要将它与Object.entries()混淆,后者返回一个键值对数组。

其他回答

正如其他人所说,不应该使用for..in迭代数组。

for ( var i = 0, len = myArray.length; i < len; i++ ) { ... }

如果你想要更简洁的语法,你可以使用forEach:

myArray.forEach( function ( val, i ) { ... } );

如果要使用此方法,请确保包含ES5 shim以添加对旧浏览器的支持。

For-in-loops遍历对象的属性。不要将它们用于数组,即使它们有时有效。

对象属性没有索引,它们都是相等的,不需要按确定的顺序遍历。如果想对属性进行计数,则必须设置额外的计数器(就像在第一个示例中所做的那样)。

循环数组:

var a = [];
for (var i=0; i<a.length; i++) {
    i // is the index
    a[i] // is the item
}

遍历对象:

var o = {};
for (var prop in o) {
    prop // is the property name
    o[prop] // is the property value - the item
}

要在数组上使用for..of循环并检索索引,您可以使用array1.indexOf(element),它将返回循环中元素的索引值。您可以使用此方法同时返回索引和值。

Array1 = ['a', 'b', 'c'] 对于(数组1的元素){ console.log(array1.indexOf(element), element) // 0 a 1 b 2 c .log(array1.indexOf(element), element }

正如注释中提到的,当数组包含非唯一值时,这将返回false index。(考虑arr = ['a', 'b', 'c', 'a'], arr[3]的索引将返回0而不是3)

在每个人发布的非常好的答案之上,我想补充的是,性能最好的解决方案是ES6条目。对于这里的许多开发者来说,这似乎是一种禁忌,所以我创建了这个perf benchamrk。

它要快6倍。主要是因为不需要:a)访问数组不止一次,b)强制转换索引。

这个怎么样

let numbers = [1,2,3,4,5]
numbers.forEach((number, index) => console.log(`${index}:${number}`))

在数组中。每个方法都有一个索引参数,该参数是数组中当前正在处理的元素的索引。