Javascript 获取元素’;使用for of对数组进行迭代时的索引
在JavaScript中,您可以使用对数组进行迭代(这是ES6的一项功能): 但有时,循环中也需要相应的元素索引;一种方法是显式使用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
条目
迭代器,如下所示:
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
创建子类,所以现在真的没有理由了(如果有)修改内置原型