警告: 问题仍然适用于循环的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

当前回答

这是我的复合迭代器版本,它产生一个索引和任何传递的生成器函数的值,并附带一个(缓慢的)素数搜索示例:

const eachWithIndex = (iterable) => { return { *[Symbol.iterator]() { let i = 0 for(let val of iteratable) { i++ yield [i, val] } } } } const isPrime = (n) => { for (i = 2; i < Math.floor(Math.sqrt(n) + 1); i++) { if (n % i == 0) { return false } } return true } let primes = { *[Symbol.iterator]() { let candidate = 2 while (true) { if (isPrime(candidate)) yield candidate candidate++ } } } for (const [i, prime] of eachWithIndex(primes)) { console.log(i, prime) if (i === 100) break }

其他回答

小数组集合的解决方案:

for (var obj in arr) {
    var i = Object.keys(arr).indexOf(obj);
}

arr -数组, obj -当前元素的KEY, i -计数器/索引

注意:方法keys()对于IE版本<9不可用,您应该使用Polyfill代码。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

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

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

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

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

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

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

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

这个怎么样

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

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

// this loop is used in advanced javascript
//For Example I have an array:
let array = [1,2,3,4,5];
1) for(let key in array){
      console.log(key);//this shows index of array {Result: 0,1,2,3,4}
      console.log(array[key]);//this show values of array {Result: 1,2,3,4,5}
   }
//Hopefully, You will quickly understand;