gpt4 book ai didi

javascript - 有什么方法可以将过滤器方法应用于自定义迭代器?

转载 作者:数据小太阳 更新时间:2023-10-29 05:34:48 26 4
gpt4 key购买 nike

<分区>

我正在研究如何在 JavaScript 中使用生成器。

由于生成器返回迭代器,我想我可以像 iterable.filter() 一样使用它,比如 array.prototype.filter

但是,可迭代对象没有filter、map、forEach、reduce方法。

所以,我制作了一个生成器版本的 filter、map、reduce、forEach 方法,如下所示。

我当前的代码

'use strict';

function* range(n) {
for (let i = 1; i <= n; i++) {
yield i;
}
}

function* filter(context, predicate) {

for (let i of context) {
if (predicate(i) === true) {
yield i;
}
}

}

function isEven(value) {
return value % 2 === 0;
}

console.log(
...filter(range(10), isEven)
);

这段代码确实有效,但我想像 range(10).filter(isEven) 一样使用它,而不是 filter(range(10), isEven) .

有什么办法可以完成我想要的吗?

我正在研究 ES6 代理、Reflect,但是嗯……我不确定这些 ES6 东西是否对我有帮助。

我想如何使用

range(10)
.filter(isEven) //generator version of filter
.map(multiplyBy5) //generator version of map
.forEach(console.log); //generator version of forEach

另一个尝试 - 不......哈哈哈......

这段代码也能正常工作,但这就像一个笑话......

'use strict';

function* filter(predicate) {
for (let i of this) {
if(predicate(i) === true) {
yield i;
}
}
}


function* map(project) {
for (let i of this) {
yield project(i);
}
}

function* range(end) {
for (let i = 0; i <= end; i++) {
yield i;
}
}

const isEven = (v) => v % 2 === 0;
const multiplyBy = (v) => (by) => v * by;

var range10_filterByEven = filter.bind(range(10), isEven);
var range10_filterByEven_multiplyBy10 = map.bind(range10_filterByEven(), multiplyBy(10));

console.log(
...range10_filterByEven_multiplyBy10() //0 20 40 60 80 100
);

看起来更好,虽然这不是我想要的样子。

'use strict';

function filter(predicate) {
return function* f() {
for (let i of this) {
if(predicate(i) === true) {
yield i;
}
}
}
}


function map(project) {
return function* m() {
for (let i of this) {
yield project(i);
}
}
}

function range(end) {
return function* r() {
for (let i = 0; i <= end; i++) {
yield i;
}
}
}

const isEven = (v) => v % 2 === 0;
const multiplyBy = (v) => (by) => v * by;


function pipe() {
return [...arguments].reduce(function(chain, current) {
return current.bind(chain());
})}

console.log(
...pipe(
range(10),
filter(isEven),
map(multiplyBy(10))
)()
);

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