Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取元素’;使用for of对数组进行迭代时的索引_Javascript_Loops_Ecmascript 6 - Fatal编程技术网

Javascript 获取元素’;使用for of对数组进行迭代时的索引

Javascript 获取元素’;使用for of对数组进行迭代时的索引,javascript,loops,ecmascript-6,Javascript,Loops,Ecmascript 6,在JavaScript中,您可以使用对数组进行迭代(这是ES6的一项功能): 但有时,循环中也需要相应的元素索引;一种方法是显式使用条目迭代器,如下所示: for (let [i, elem] of arr.entries()) { // elem = current element // i = current index } 现在,可能只有我一个人,但是.entries()部分使得这个模式有点混乱,可读性较差,所以我将entries作为arr的默认迭代器: arr[Symbol.i

在JavaScript中,您可以使用对数组进行迭代(这是ES6的一项功能):

但有时,循环中也需要相应的元素索引;一种方法是显式使用
条目
迭代器,如下所示:

for (let [i, elem] of arr.entries()) {
  // elem = current element
  // i = current index
}
现在,可能只有我一个人,但是
.entries()
部分使得这个模式有点混乱,可读性较差,所以我将
entries
作为
arr
的默认迭代器:

arr[Symbol.iterator] = Array.prototype.entries; 
现在我可以省去它了:

for (let [i, elem] of arr) {
  // elem = current element
  // i = current index
}
现场演示:


但是,我还没有弄清楚如何将这个“黑客”应用于所有阵列(即使其成为全局默认)。这可能吗?它是否有任何副作用或缺点(除了必须始终指定
i
,即使您不使用它,这对linters来说可能是一个问题),我猜)

您可以创建自己的类来扩展本机
数组
,并将其默认迭代器更改为
数组.prototype。条目

class MyArray extends Array {}
MyArray.prototype[Symbol.iterator] = Array.prototype.entries
然后创建MyArray的新实例,如下所示:

const arr = new MyArray(1, 2, 3)
for (let [i, elem] of arr) {
  console.log(`Element ${elem} at index ${i}`)
}
然后像这样迭代:

const arr = new MyArray(1, 2, 3)
for (let [i, elem] of arr) {
  console.log(`Element ${elem} at index ${i}`)
}

请参阅。

如果您担心linter,jshint支持文件顶部的
//jshint esnext:true
。不确定要求是什么?注意:我认为更改
Array
的默认迭代器(即
Array.prototype[Symbol.iterator]=Array.prototype.entries
)就足够了,但这也有一些奇怪的问题。无论如何,修改本机对象不是一个好主意。我尝试过设置
Array.prototype[Symbol.iterator]
,但是我得到了错误的输出(请参阅我对另一个答案的评论中的演示)。@ŠimeVidas是的,这就是为什么你应该创建自己的类。@Šime你可以在ES2015中为
Array
创建子类,所以现在真的没有理由了(如果有)修改内置原型