使用for…获取循环计数器/索引;JavaScript中的语法分析 警告:

使用for…获取循环计数器/索引;JavaScript中的语法分析 警告:,javascript,for-loop,foreach,counter,Javascript,For Loop,Foreach,Counter,问题仍然适用于for…of循环。>不要在中使用for…来迭代数组,使用它来迭代 覆盖对象的属性。也就是说,这个 我知道JavaScript中…的基本语法如下所示: for (var obj in myArray) { // ... } 但是如何获取循环计数器/索引 我知道我可能会做一些类似的事情: 甚至是善良的老人: for…in迭代属性名,而不是值,并且这样做(是的,即使在ES6之后)。您不应该使用它来迭代数组。对于它们,有ES5的forEach方法,它将值和索引传递给给定的函数:

问题仍然适用于
for…of
循环。>不要在
中使用
for…来迭代数组,使用它来迭代
覆盖对象的属性。也就是说,这个


我知道JavaScript中…的基本
语法如下所示:

for (var obj in myArray) {
    // ...
}
但是如何获取循环计数器/索引

我知道我可能会做一些类似的事情: 甚至是善良的老人:
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,它现在支持所有当前浏览器版本:

for (const [i, value] of myArray.entries()) {
    console.log('%d: %s', i, value);
}
一般来说,对于iterables(您将使用
For…of
循环,而不是
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);
}


如果您实际上是指
中的“
”枚举属性,那么您需要一个额外的计数器
Object.keys(obj.forEach
可以工作,但它只包含自己的属性<代码>for…in
包括原型链上任何位置的可枚举属性。

for in循环迭代对象的属性。不要将它们用于数组,即使它们有时可以工作

对象属性则没有索引,它们都是相等的,不需要按确定的顺序运行。如果要计算属性,则必须设置额外的计数器(如第一个示例所示)

在阵列上循环:

var a = [];
for (var i=0; i<a.length; i++) {
    i // is the index
    a[i] // is the item
}

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

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

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

小型阵列集合的解决方案:

for (var obj in arr) {
    var i = Object.keys(arr).indexOf(obj);
}
arr-阵列, obj-当前元素的键, i-计数器/索引


注意:方法键()不适用于ES6中的IE版本,最好使用for-of循环。 你可以像这样把索引放进去

for (let [index, val] of array.entries()) {
        // your code goes here    
}
请注意,
Array.entries()
返回值,这允许它在for-of循环中工作;不要将其与,它返回一个键值对数组相混淆

这个怎么样

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

其中
array.forEach
此方法有一个
index
参数,该参数是数组中正在处理的当前元素的索引。

这里有一个函数
eachWithIndex
,它可以处理任何可编辑的内容

您还可以编写一个类似的函数
eachWithKey
,该函数使用
for…in
与Objects一起工作

// example generator (returns an iterator that can only be iterated once)
function* eachFromTo(start, end) { for (let i = start; i <= end; i++) yield i }

// convers an iterable to an array (potential infinite loop)
function eachToArray(iterable) {
    const result = []
    for (const val of iterable) result.push(val)
    return result
}

// yields every value and index of an iterable (array, generator, ...)
function* eachWithIndex(iterable) {
    const shared = new Array(2)
    shared[1] = 0
    for (shared[0] of iterable) {
        yield shared
        shared[1]++
    }
}

console.log('iterate values and indexes from a generator')
for (const [val, i] of eachWithIndex(eachFromTo(10, 13))) console.log(val, i)

console.log('create an array')
const anArray = eachToArray(eachFromTo(10, 13))
console.log(anArray)

console.log('iterate values and indexes from an array')
for (const [val, i] of eachWithIndex(anArray)) console.log(val, i)
//示例生成器(返回只能迭代一次的迭代器)

函数*eachFromTo(start,end){for(let i=start;i这是我的复合迭代器版本,它生成一个索引和任何传递的生成器函数的值,带有一个(慢速)素数搜索示例:

consteachwithindex=(iterable)=>{
返回{
*[符号.迭代器](){
设i=0
for(让val为可迭代的){
我++
收益率[i,val]
}
}
}
}
常量isPrime=(n)=>{
对于(i=2;i}
rushUp给出的答案是正确的,但这样会更方便

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

在每个人发布的非常好的答案之上,我想补充一点,最有效的解决方案是ES6
条目
。对于这里的许多开发人员来说,这似乎与直觉相反,所以我创建了


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

要用于数组上的循环和检索索引,可以使用
array1.indexOf(element)
将返回循环中元素的索引值。您可以使用此方法同时返回索引和值

array1=['a','b','c']
用于(阵列1的元素){
console.log(array1.indexOf(element),element)//0a1b2c

}
不要使用for…in for数组。不管怎样,它会迭代属性名称,而不是属性值。它是数组,不是对象,对吗?所以,
alert(obj)
?哦,好吧。我很困惑。我认为JavaScript的in和Python的是一样的。谢谢你的澄清。@quantumpotato:
s是
var
s,具有块作用域。
const
s是不变的。这是一个详细的答案,谢谢。真正澄清了所有讨论的事情。愚蠢的问题%d和%s是什么实际上代表,或者可能是我想要的任何字母?@klewis:
%d
格式化一个整数,
%s
格式化一个字符串。它们基于。规范正在进行中。永不执行
(var i=0;i@FelixSanz:浪费资源?不可能。这是一个不成熟的微优化,几乎没有必要,而且
var i=0;i@FelixSanz:是的,并且
var i=0;i。如果您在真正需要它的地方编写循环,那么您要么是做错了什么,要么您有比“最佳实践”更好的理由证明它的必要性。是的,这是一种标准做法,但不适用于一般性能优化,而仅适用于微观优化。KISS适用于所有地方。是一种反做法。我建议:使用计数器代替,在循环中递增。在mayankcpdixit的基础上,使用计数器代替,因为indexOf可能会对性能产生负面影响。对象越大,性能越差这会变慢。这不会扩展。这是一种毫无意义的缓慢和复杂,因为
var i=0;
i++;
for (var obj in arr) {
    var i = Object.keys(arr).indexOf(obj);
}
for (let [index, val] of array.entries()) {
        // your code goes here    
}
let numbers = [1,2,3,4,5]
numbers.forEach((number, index) => console.log(`${index}:${number}`))
// example generator (returns an iterator that can only be iterated once)
function* eachFromTo(start, end) { for (let i = start; i <= end; i++) yield i }

// convers an iterable to an array (potential infinite loop)
function eachToArray(iterable) {
    const result = []
    for (const val of iterable) result.push(val)
    return result
}

// yields every value and index of an iterable (array, generator, ...)
function* eachWithIndex(iterable) {
    const shared = new Array(2)
    shared[1] = 0
    for (shared[0] of iterable) {
        yield shared
        shared[1]++
    }
}

console.log('iterate values and indexes from a generator')
for (const [val, i] of eachWithIndex(eachFromTo(10, 13))) console.log(val, i)

console.log('create an array')
const anArray = eachToArray(eachFromTo(10, 13))
console.log(anArray)

console.log('iterate values and indexes from an array')
for (const [val, i] of eachWithIndex(anArray)) console.log(val, i)
for (let [index, val] of array.entries() || []) {
   // your code goes here    
}