注意:

question still applies to for…of loops.> Don't use for…in to iterate over an Array, use it to iterate over the properties of an object. That said, this


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

for (var obj in myArray) {
    // ...
}

但是我怎么才能得到counter/index圈呢?

我知道我可能会这样做:

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

推荐答案

for…in迭代属性名,而不是值,这样做in an unspecified order次(是的,即使在ES6之后).你不应该用它来迭代array.对于他们来说,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…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);
}

demo

如果您实际上指的是for…in-枚举属性-您将需要一个额外的计数器.Object.keys(obj).forEach可以工作,但它只包括own个属性;for…in包括原型链上任何位置的可枚举属性.

Javascript相关问答推荐

在shiny 模块中实现JavaScript

如何在不使用类型化数组的情况下将32位浮点数按位转换为整值?

如何指定1条记录1个表?

传递一个大对象以在Express布局中呈现

TypeScript索引签名模板限制

在网页上添加谷歌亵渎词

函数返回与输入对象具有相同键的对象

实现JS代码更改CSS元素

Angular 中的类型错误上不存在获取属性

确保函数签名中的类型安全:匹配值

使用auth.js保护API路由的Next.JS,FETCH()不起作用

如何在JAVASCRIPT中合并两组对象并返回一些键

如何找到带有特定文本和测试ID的div?

与在编剧中具有动态价值的定位器交互

未捕获的不变违规:即使在使用DndProvider之后也应使用拖放上下文

为什么我的Navbar.css没有显示在本地主机页面上?

有没有办法在R中创建一张具有多个色标的热图?

是否有静态版本的`instanceof`?

Firebase函数中的FireStore WHERE子句无法执行

我如何才能让p5.js在不使用实例模式的情况下工作?