私はstdin
に渡された一連のテキストを処理するツールを作成していますが、各行は「エントリ」です。コードをより機能的にしたいので、一連の行を "シーケンス"または "iterable"として扱い、reduce
を使って繰り返します。ノードストリームを反復可能として扱う方法はありますか?
私は現在の線の集合としてstdin
を処理するNodeモジュールLineStreamを使用していますが、それは行ごとにdata
イベントを送出することによって動作します - それはReadable Streamインタフェースを実装しています、大丈夫です。
だから私は現在、私の関数にするたびに、暫定値を渡すことによってdata
イベントが発生減らす非常に「取扱説明書」のようなものやってる:
var windows = [];
linestream.on('data', function(line) {
return windows = rollup(windows, extractDate(line), argv.w);
});
linestream.on('end', function() {
return process.stdout.write(toCsv(windows));
});
process.stdin.resume();
をしかし、それを行うのは、より機能的になるだろう何かのように:私は上の私のツールを実行しているとき、もちろん
linestream.lines.reduce(rollup, []);
function rollup(windows, line) {
// would return a new interim or final value
}
、私は通常の配列にすべての行を「収集」し、それを減らすことが、私はそれを試してみましたが、それはあまりにも多くのメモリを使用して可能性があり大規模なデータセット - それでは、繰り返しのようなものeストリームは本当に必要なものです。
私は、これを行うNode関数/モジュールを書くことができるかどうか、または既に存在するかどうかを聞いています。
ありがとうございます!
これは私に思い出させるhttp://blip.tv/jsconfeu/jed-schmidt-getting-functional-with-fab-4399811 – clyfe
ちょうど見つかった[getline](http://www.cvine.plus.com/getline/itex.html)は 'next()'メソッドを持っているのでパズルの一部であるようですが、 "iterable"のように見えます。しかし、これについてもっと考えると、V8での "iterables"のサポートがなければもっと可能になるかもしれないと思うのですが、私は自分自身で 'reduce'を実装することができます。...うーん... –
getlineは基本的にやっているようですあなたがやっていることですが、データが構造化されていないと仮定しています。あなたのデータがイベントごとに1行であると仮定すれば、getlineを使う必要はありません。 – Andrew