gpt4 book ai didi

javascript - 将迭代器项分布到子迭代器上

转载 作者:行者123 更新时间:2023-11-28 03:44:46 24 4
gpt4 key购买 nike

我正在用 javascript 玩迭代器。我找到了一种链接它们的方法,这样我就不必嵌套它们,只是为了提高可读性。

它的工作原理与数组映射链完全相同。

我喜欢做的是将生成器的项目分配给几个子迭代器,捕获结果并将它们提供给下一个迭代器。这样结果将是这样的:

4
6
8
7
9
11

鉴于这段代码:

"use strict";

const _ = require('lodash');

let things = chain([
gen,
addOne,
distribute([
addOne,
addTwo,
addThree
]),
addOne
]);

for(let thing of things) {
console.log(thing);
}

//////////////// DEFENITIONS ////////////////////

function* gen() {
yield* [1, 2, 3, 4, 5, 6];
}

function* addOne(iterator) {
for(let item of iterator) {
yield (item + 1)
}
}

function* addTwo(iterator) {
for(let item of iterator) {
yield (item + 2)
}
}

function* addThree(iterator) {
for(let item of iterator) {
yield (item + 3)
}
}

const distribute = _.curry(function* (iterators, iterator) {
// magic
});

function chain(iterators) {
return iterators.reduce((prevIterator, thisIterator, index) => {
if(index === 0) {
return thisIterator();
}
return thisIterator(prevIterator);
}, null);
}

最终我想向分布迭代器添加一个分布函数,这样它就可以确定将哪个项目传递给哪个子迭代器。目前它只是基于订单。

问题:如何编写一个分布迭代器,它将几个子迭代器作为参数并将结果传递给下一个迭代器。

最佳答案

看起来过于复杂,但确实有效

const distribute = _.curry(function* (iterators, mainIterator) {
let iteratorIndex = 0;
let done = [];
for(let iterator of iterators) {
iterators[iteratorIndex] = iterator(mainIterator);
done.push(false);
iteratorIndex++;
}
while(true) {
let iteratorIndex = 0;
for(let iterator of iterators) {
let next = iterator.next();
done[iteratorIndex] = next.done;
if(!next.done) {
yield next.value;
}
iteratorIndex++;
}
if(done.every(done => done)) {
return;
}
}
});

最后还有一个分布函数:

const distribute = _.curry(function* (genIteratorIndex, iterators, mainIterator) {
let iteratorIndex = 0;
let done = [];

// instantiate iterators
for(let iterator of iterators) {
iterators[iteratorIndex] = iterator(mainIterator);
done.push(false);
iteratorIndex++;
}

// Pass stuff through
while(true) {
let next = iterators[genIteratorIndex.next().value].next();
done[iteratorIndex] = next.done;
if(!next.done) {
yield next.value;
}
if(done.every(done => done === true)) {
return;
}
}
});

function* subSequent(len) {
let curr = 0;
while(true) {
if(curr === len) {
curr = 0;
}
yield curr;
curr++;
}
}


let things = chain([
gen,
addOne,
distribute(subSequent(3), [
addOne,
addTwo,
addThree
]),
addOne
]);

关于javascript - 将迭代器项分布到子迭代器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48599331/

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