使用反向迭代条目的方法扩展 JavaScript 数组原型?
Posted
技术标签:
【中文标题】使用反向迭代条目的方法扩展 JavaScript 数组原型?【英文标题】:Extend JavaScript Array prototype with method to iterate entries in reverse? 【发布时间】:2021-12-29 19:42:43 【问题描述】:暂时搁置修改 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”——它不是指数组本身,而是指迭代器。有什么想法吗?
【问题讨论】:
如果要引用动态this
参数,请不要使用箭头函数。
【参考方案1】:
使用生成器功能会更容易。调用原始的 .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);
【讨论】:
嗯。这样可行。受您使用生成器的启发,我想出了一些更简洁的东西:Array.prototype.entriesReverse = function*() for(let index = this.length - 1; index >= 0; index--) yield [index, this[index]];
这似乎工作得很好。 :)以上是关于使用反向迭代条目的方法扩展 JavaScript 数组原型?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript JavaScript:反向字符串[扩展本机]