在 for-of 循​​环中访问 ES6 数组元素索引

IT技术 javascript ecmascript-6 for-of-loop
2021-01-19 05:04:29

我们可以使用 for-of 循​​环访问数组元素:

for (const j of [1, 2, 3, 4, 5]) {
  console.log(j);
}

如何修改此代码以访问当前索引?我想使用 for-of 语法来实现这一点,既不是 forEach 也不是 for-in。

6个回答

使用Array.prototype.keys

for (const index of [1, 2, 3, 4, 5].keys()) {
  console.log(index);
}

如果您要访问这两个键和值,可以使用Array.prototype.entries()解构

for (const [index, value] of [1, 2, 3, 4, 5].entries()) {
  console.log(index, value);
}

@K48 很高兴知道,如果您想在 es 中获得最快的速度,请使用“反向 for 循环”:难以置信的 web.com/blog/...
2021-03-14 05:04:29
@KyleBaker for-of 循​​环有.entires()什么问题?
2021-03-16 05:04:29
不幸的是,我需要从嵌套循环内部屈服。不能使用 forEach,因为该函数会为yield关键字创建范围问题但是我需要访问我的用例的索引,所以......;;我猜是基本的旧循环。
2021-03-23 05:04:29
如果有人想知道,我测试for-of.entries()它,它比.forEach(). jsperf.com/for-of-vs-foreach-with-index
2021-04-03 05:04:29
相反,您可以缓存长度为jsperf.com/reverse-loop-vs-cache 的反向循环当您能够处理流而不在 RAM 中创建大数组时,for-of 对于可迭代处理很有用。循环速度不会成为瓶颈,因为在这种情况下您会有 I/O 延迟。
2021-04-04 05:04:29

Array#entries 返回索引和值,如果你需要两者:

for (let [index, value] of array.entries()) {

}
@Steven:如果你不需要索引,你可以做for (var value of document.styleSheets) {}. 如果确实需要索引,可以先通过Array.from:将值转换为数组for (let [index, value] of Array.from(document.styleSheets)) {}
2021-03-14 05:04:29
那很好!Array.from是 FTW
2021-03-26 05:04:29
不太好。抛出错误,例如,document.styleSheets[0].cssRules.entries()甚至document.styleSheets.entries()可能还有许多其他 DOM 可迭代结构。仍然必须使用_.forEach()fromlodash
2021-04-07 05:04:29
使用 TypeScript:“TS2495:Type IterableIterator 不是数组类型或字符串类型”。好像这个会解决:github.com/Microsoft/TypeScript/pull/12346
2021-04-08 05:04:29
也不支持 Internet Explorer。
2021-04-13 05:04:29

在这个充满华丽新本机功能的世界中,我们有时会忘记基础知识。

for (let i = 0; i < arr.length; i++) {
    console.log('index:', i, 'element:', arr[i]);
}

干净、高效,你仍然可以break循环。奖金!您也可以从结尾开始,然后使用i--!

附加说明:如果您在循环中大量使用该值,您可能希望const value = arr[i];在循环的顶部一个简单易读的参考。

顺便说一下,条件应该是这样的 -> for (let i = 0; i < arr.length; i++) 没有 (-1) 否则它不会遍历数组的所有元素。
2021-03-16 05:04:29
你仍然可以breakafor-of并且for (let [index, value] of array.entries())更容易阅读。倒退就像添加.reverse().
2021-03-17 05:04:29
对于这个问题,我认为这是一个完全可以接受的答案。它永远不会成为公认的答案,但它已经帮助了几十个或更多搜索过这个问题的人。这就是 SO 的用途。
2021-03-21 05:04:29
是的。不错,简洁明了。哦,就像这样,您有一种超级简单的方法来访问数组的键/索引。
2021-03-30 05:04:29
简单for循环比for of array.entries(). jsbench.me/6dkh13vqrr/1
2021-04-11 05:04:29

for..of循环中,我们可以通过array.entries(). array.entries返回一个新的数组迭代器对象。迭代器对象当时知道如何从可迭代对象访问项目,同时跟踪其在该序列中的当前位置。

当在next()迭代器上调用方法时,会生成键值对。在这些键值对中,数组索引是键,数组项是值。

let arr = ['a', 'b', 'c'];
let iterator = arr.entries();
console.log(iterator.next().value); // [0, 'a']
console.log(iterator.next().value); // [1, 'b']

for..of环是基本上消耗可迭代,并通过所有的元素(使用罩下一个迭代)环路的构建体。我们可以array.entries()通过以下方式将其与此结合

array = ['a', 'b', 'c'];

for (let indexValue of array.entries()) {
  console.log(indexValue);
}


// we can use array destructuring to conveniently
// store the index and value in variables
for (let [index, value] of array.entries()) {
   console.log(index, value);
}

如果您需要索引您也可以自己处理索引,如果您需要密钥,它将不起作用

let i = 0;
for (const item of iterableItems) {
  // do something with index
  console.log(i);

  i++;
}