获取循环计数器/索引使用 for...的语法在 JavaScript 中

2022-08-29 23:02:18

谨慎:

问题仍然适用于循环>不要用来循环访问数组,用它来循环访问对象的属性。也就是说,这个for…offor…in


我知道JavaScript中的基本语法看起来像这样:for…in

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

答案 1

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

或者ES6的Array.prototype.entries,它现在支持当前的浏览器版本:

for (const [i, value] of myArray.entries()) {
    console.log('%d: %s', i, value);
}

对于一般的可迭代对象(您将使用循环而不是循环),没有任何内置功能,但是:for…offor…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);
}

演示

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


答案 2

在ES6中,最好使用循环。你可以像这样获取索引for... offor... of

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

请注意,返回一个迭代器,这是允许它在for-of循环中工作的原因;不要将其与 Object.entries() 混淆,后者返回一个键值对数组Array.entries()