用反向迭代条目的方法扩展JavaScript数组原型



暂时抛开修改JavaScript的Array.prototype的顾虑,我该如何在Array原型上编写一个自定义方法来反向返回迭代器?具体来说,我想提供一个entriesReverse((方法,它的作用与Array.prototype.entries((完全相同,只是顺序相反。我有一个定制功能:

const entriesReverse = (array) => ({
[Symbol.iterator]() {
let index = array.length;
return {
next: () => ({
value: [--index, array[index]],
done: index < 0
})
}
}
})

但如果我能弄清楚如何在现有的Array原型上实现这一方法,我会非常惊讶。问题似乎是试图在Symbol.iterator块中引用"this"——它不是指数组本身,而是指迭代器。有什么想法吗?

使用生成器函数会更容易。调用原始的.entries()并将其转换为一个条目数组,然后在该数组和每个条目的yield上向后迭代。

Array.prototype.entriesReverse = function*() {
const entries = [...this.entries()];
for (let i = entries.length - 1; i >= 0; i--) {
yield entries[i];
}
};
for (const entry of ['a', 'b', 'c'].entriesReverse()) {
console.log(entry);
}

另一种选择:

Array.prototype.entriesReverse = function*() {
yield* [...this.entries()].reverse();
};
for (const entry of ['a', 'b', 'c'].entriesReverse()) {
console.log(entry);
}

最新更新