hob*_*es3 252 javascript foreach counter for-loop
警告:
问题仍然适用于
for…of
循环.>不要使用for…in
迭代数组,用它来迭代对象的属性.那说,这个
我知道for…in
JavaScript 中的基本语法如下所示:
for (var obj in myArray) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是如何获得循环计数器/索引?
var i = 0;
for (var obj in myArray) {
alert(i)
i++
}
Run Code Online (Sandbox Code Playgroud)
for (var i = 0; i < myArray.length; i++) {
var obj = myArray[i]
alert(i)
}
Run Code Online (Sandbox Code Playgroud)
但我宁愿使用更简单的for-in
循环.我认为它们看起来更好,更有意义.
有更简单或更优雅的方式吗?
for i, obj in enumerate(myArray):
print i
Run Code Online (Sandbox Code Playgroud)
Ry-*_*Ry- 433
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
Run Code Online (Sandbox Code Playgroud)
或ES6 Array.prototype.entries
,现在支持当前的浏览器版本:
for (const [i, value] of myArray.entries()) {
console.log('%d: %s', i, value);
}
Run Code Online (Sandbox Code Playgroud)
对于一般的iterables(你将使用for…of
循环而不是a for…in
),没有内置的东西,但是:
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);
}
Run Code Online (Sandbox Code Playgroud)
如果你真的意味着for…in
- 枚举属性 - 你需要一个额外的计数器.Object.keys(obj).forEach
可以工作,但它只包括自己的属性; for…in
包括原型链上任何位置的可枚举属性.
小智 132
在ES6中,最好使用for-of循环.您可以获得这样的索引
for (let [index, val] of array.entries()) {
// your code goes here
}
Run Code Online (Sandbox Code Playgroud)
注意,Array.entries()
返回一个迭代器,它允许它在for-of循环中工作; 不要将它与Object.entries()混淆,后者返回一个键值对数组.
San*_*Shr 19
这个怎么样
let numbers = [1,2,3,4,5]
numbers.forEach((number, index) => console.log(`${index}:${number}`))
Run Code Online (Sandbox Code Playgroud)
其中array.forEach
,该方法具有一index
参数,该参数是阵列中当前正在处理的元素的索引.
iwa*_*eed 17
小数组集合的解决方案:
for (var obj in arr) {
var i = Object.keys(arr).indexOf(obj);
}
Run Code Online (Sandbox Code Playgroud)
arr - ARRAY, obj - 当前元素的关键字, i - COUNTER/INDEX
注意:方法键()不适用于IE版本<9,您应该使用Polyfill代码. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Ber*_*rgi 12
For-in-loops迭代Object的属性.不要将它们用于数组,即使它们有时也可以工作.
然后,对象属性没有索引,它们都是相等的,不需要按确定的顺序运行.如果要计算属性,则必须设置额外的计数器(就像在第一个示例中所做的那样).
循环数组:
var a = [];
for (var i=0; i<a.length; i++) {
i // is the index
a[i] // is the item
}
Run Code Online (Sandbox Code Playgroud)
循环对象:
var o = {};
for (var prop in o) {
prop // is the property name
o[prop] // is the property value - the item
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,你不应该使用for..in迭代数组.
for ( var i = 0, len = myArray.length; i < len; i++ ) { ... }
Run Code Online (Sandbox Code Playgroud)
如果您想要更清晰的语法,可以使用forEach:
myArray.forEach( function ( val, i ) { ... } );
Run Code Online (Sandbox Code Playgroud)
如果要使用此方法,请确保包含ES5填充程序以添加对旧版浏览器的支持.
rushUp 给出的答案是正确的,但这会更方便
for (let [index, val] of array.entries() || []) {
// your code goes here
}
Run Code Online (Sandbox Code Playgroud)