【问题标题】:Extend JavaScript Array prototype with method to iterate entries in reverse?使用反向迭代条目的方法扩展 JavaScript 数组原型?
【发布时间】: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 参数,请不要使用箭头函数。

标签: javascript arrays iterator prototype reverse


【解决方案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 &gt;= 0; index--) { yield [index, this[index]]; } } 这似乎工作得很好。 :)
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 2013-01-28
  • 2014-11-22
  • 1970-01-01
  • 2017-01-15
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多