如何在JavaScript中使用for-in语法获得循环计数器/索引?

编辑:不要使用for-in迭代一个数组,使用它来迭代对象的属性 我会保留这个答案作为参考。 谢谢大家!

我理解JavaScript中循环的基本的for-in语法如下所示:

for(var obj in myArray) { } 

但是我如何获得循环计数器/索引? 我知道我可以做一些事情:

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

甚至是好的,旧的:

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

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

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

在Python中很容易:

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

for…in迭代属性名称,而不是值,并以一个未指定的顺序 (是的,即使在ES6之后)。 你不应该用它来遍历数组。 对于他们来说,ES5的forEach方法将值和索引都传递给你给它的函数:

 var myArray = [123, 15, 187, 32]; myArray.forEach(function (value, i) { console.log('%d: %s', i, value); }); // Outputs: // 0: 123 // 1: 15 // 2: 187 // 3: 32 

对于一般的iterables(你将使用for…of循环而不是for…in ),没有任何内build的,但你可以自己做:

 function* enumerate(iterable) { let i = 0; for (const x of iterable) { yield [i, x]; i++; } } for (const [i, obj] of enumerate(myArray)) { console.log(i, obj); } 

演示

如果你确实意味着for…in枚举属性 – 你需要一个额外的计数器。 Object.keys(obj).forEach可以工作,但它只包含自己的属性; for…in包含原型链上任何位置的枚举属性。

在ES6中,使用for-of循环是很好的。 你可以像这样得到索引

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

请注意, Array.entries()返回一个迭代器 ,它允许它在for-of循环中工作。 不要把它与Object.entries()混淆, Object.entries()返回一键值对。

小数组集合的解决scheme:

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

arr – ARRAY, obj – 当前元素的KEY, i – COUNTER / INDEX

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

For-in-loops迭代对象的属性。 不要将它们用于arrays,即使它们有时可以工作。

对象属性然后没有索引,它们都是相等的,不需要以确定的顺序运行。 如果你想计算属性,你将不得不设置额外的计数器(就像你在第一个例子中所做的那样)。

循环一个数组:

 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..in迭代一个数组。

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

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

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

如果您想使用这种方法,请确保包含ES5填充以添加对旧版浏览器的支持。