我在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);
}
最终我想在分布迭代器中添加一个分布函数,因此它可以确定将哪个项传递给哪个子实例。现在它只是基于订单。
问题:如何编写一个分布迭代器,它将一些子参与者作为参数并将结果传递给下一个迭代器。
答案 0 :(得分:0)
看起来过于复杂,但它有效
predict(myModel, structure(list(1), .Names = attr(terms(myModel), "term.labels"), class = "data.frame"))
最后有一个分发函数:
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;
}
}
});