Get loop counter/index using for…of syntax in JavaScript

后端 未结 11 1977
走了就别回头了
走了就别回头了 2020-11-28 00:55

Caution:

question still applies to for…of loops.> Don\'t use for…in to iterate over an Array, use it

11条回答
  •  感动是毒
    2020-11-28 01:30

    for…in iterates over property names, not values, and does so in an unspecified order (yes, even after ES6). You shouldn’t use it to iterate over arrays. For them, there’s ES5’s forEach method that passes both the value and the index to the function you give it:

    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
    

    Or ES6’s Array.prototype.entries, which now has support across current browser versions:

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

    For iterables in general (where you would use a for…of loop rather than a for…in), there’s nothing built-in, however:

    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);
    }
    

    demo

    If you actually did mean for…in – enumerating properties – you would need an additional counter. Object.keys(obj).forEach could work, but it only includes own properties; for…in includes enumerable properties anywhere on the prototype chain.

提交回复
热议问题