gpt4 book ai didi

javascript - 如何使用作为生成器并能够链接它们的函数来扩展数组?

转载 作者:行者123 更新时间:2023-11-29 10:27:06 25 4
gpt4 key购买 nike

如何使用返回生成器对象的函数扩展 Array 并能够链接它们?

我已经尝试扩展数组以查看是否可以链接生成器函数。第一个调用有效,但下一个链不会,因为它返回一个生成器对象,我不知道如何扩展它。

Array.prototype.select = function* (fn) {
let it = this[Symbol.iterator]();
for (let item of it) yield fn(item);
}

Array.prototype.where = function* (fn) {
let it = this[Symbol.iterator]();
for (let item of it) {
if (fn(item)) yield item;
}
}

我希望能够将这样的生成器链接到一个数组

let result = arr.select(v => v * 2)
.where(v => v % 3 === 0);

for (let item of result) console.log(item);

最佳答案

在不修改 Object 的情况下,您仍然可以使用我创造的技术将这些方法链接起来 "superclassing" .

您首先定义 Array 将扩展的基类,然后修改 Array 的原型(prototype)链以人为地扩展您的基类。

请注意 select()where() 方法如何封装您的原始生成器函数以返回该类的新实例,以便这些方法是可链接的。

class Enumerable {
constructor (getIterator) {
this[Symbol.iterator] = getIterator;
}

select (fn) {
return new Enumerable(function * () {
for (const value of this) {
yield fn(value);
}
}.bind(this));
}

where (fn) {
return new Enumerable(function * () {
for (const value of this) {
if (fn(value)) yield value;
}
}.bind(this));
}
}

Object.setPrototypeOf(Array, Enumerable);
Object.setPrototypeOf(Array.prototype, Enumerable.prototype);

const array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const result = array
.select(v => v * 2)
.where(v => v % 3 === 0);

for (const item of result) {
console.log(item);
}

关于javascript - 如何使用作为生成器并能够链接它们的函数来扩展数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56292322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com