使用反向迭代条目的方法扩展 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 &gt;= 0; index--) yield [index, this[index]]; 这似乎工作得很好。 :)

以上是关于使用反向迭代条目的方法扩展 JavaScript 数组原型?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript JavaScript:反向字符串[扩展本机]

使用__iter__ , 和__reversed__ 实现正反向迭代器

JavaScript:反向字符串[扩展本机]

自定义迭代器:比如输入奇数项,反向迭代等

正反向迭代器

容器迭代器