UnderscoreのMap Reduce
最近Node.jsの経典モジュールを探して読みたいです.Javascriptの技能を磨いて、Node.jsの理解を深めます.Node.jsのregistryページを開けば、Underscoreが一番多く使われていることが分かります.Underscoreのソースコードを読み始めて、すぐに崩壊して、
ツッコミが終わったら、生活は続けなければなりません.Underscoreはよく使う関数の種類で、はっきり言って、javascript言語自体が欠けているいくつかの常用機能を補います.Node.jsとブラウザ環境でも使えます.特に環境がこのような関数を提供しているなら、Underscoreは直接環境処理に委託し、効率と普遍性を考慮しています.
中の二つの関数mapとreduceに興味があります.その理由は簡単で、Hadoopの中のMap Reduceを連想しやすいです.偉人の歩みをたどってみましょう.関数的にプログラミングされたMap Reduceの統計文字の出現頻度を示してください.正直に言えば、HadoopのMap Reduceの思想とはとても近いです.
物語の始まり
Node.js環境で実行します.まずUnderscoreモジュールを導入します.
Mapのプロセスはタスクを分割するプロセスであり、大きなタスクを複数の小さなタスクに分割して単独で処理します.支配人はデータを必要として、部下の何人かの小兵に命令して、それぞれ独立したモジュールを分けて、それぞれ処理します.ここでの小さなタスクは論理が同じで、処理データが違っています.各タスクが並行して実行できるかどうかは、環境次第です.Node.jsはシングルスレッドで、明らかに並列処理はできません.これはボスが1つの部下しかないのに相当します.何度も同じ部下に配置されています.Hadoopの中の小さい任務は普通は複数の機械の上で実行して、明らかに並列処理して、支配人に相当して多くの部下があって、みんなは同時に任務を処理します.まず、段落を単語に分割して、単語単位で統計して、統計結果をmapに入れます.
Reduceは一つのまとめの過程です.社長が見たいのは一つのまとめの結果です.まとめをするときは、一時的なまとめ結果を記憶する場所が必要です.メモはこの仕事に使います.moもmapです.初期値は空です.
Underscor公式サイト
obj.length === +obj.length
、死にたいですか?その後、stackover flowで答えを見つけました.一緒に降りたら、Javaプログラマーとしてはつらいです.あと誰がjavascriptが簡単だと言っていますか?javascript文法は確かに簡単ですが、無限の可能性と使い方が拡張されています.一部のBrendan Eich大神がjavascriptを設計すると信じています.ツッコミが終わったら、生活は続けなければなりません.Underscoreはよく使う関数の種類で、はっきり言って、javascript言語自体が欠けているいくつかの常用機能を補います.Node.jsとブラウザ環境でも使えます.特に環境がこのような関数を提供しているなら、Underscoreは直接環境処理に委託し、効率と普遍性を考慮しています.
中の二つの関数mapとreduceに興味があります.その理由は簡単で、Hadoopの中のMap Reduceを連想しやすいです.偉人の歩みをたどってみましょう.関数的にプログラミングされたMap Reduceの統計文字の出現頻度を示してください.正直に言えば、HadoopのMap Reduceの思想とはとても近いです.
物語の始まり
Node.js環境で実行します.まずUnderscoreモジュールを導入します.
var score = require('underscore');
統計にはサンプルが必要です.ここでは簡単な文字を使います. var words = 'Also known as inject and foldl reduce boils down a list of values into a single value.'+
' Memo is the initial state of the reduction, and each successive step of it should be '+
'returned by iterator. The iterator is passed four arguments: the memo, then the value '+
'and index (or key) of the iteration, and finally a reference to the entire list.';
MapMapのプロセスはタスクを分割するプロセスであり、大きなタスクを複数の小さなタスクに分割して単独で処理します.支配人はデータを必要として、部下の何人かの小兵に命令して、それぞれ独立したモジュールを分けて、それぞれ処理します.ここでの小さなタスクは論理が同じで、処理データが違っています.各タスクが並行して実行できるかどうかは、環境次第です.Node.jsはシングルスレッドで、明らかに並列処理はできません.これはボスが1つの部下しかないのに相当します.何度も同じ部下に配置されています.Hadoopの中の小さい任務は普通は複数の機械の上で実行して、明らかに並列処理して、支配人に相当して多くの部下があって、みんなは同時に任務を処理します.まず、段落を単語に分割して、単語単位で統計して、統計結果をmapに入れます.
var string_array = words.split(/[\s]/);
console.log(string_array);
var mapped = score.map(string_array, function(element, index){
var stat = {};
if(element){
for(var i=0; i<element.length; i++){
var c = element.charAt(i);
if(c.match(/\w/)){
if(stat[c]){
stat[c] += 1;
}else{
stat[c] = 1;
}
}
}
}
return stat;
});
console.log();
console.log(mapped);
ReduceReduceは一つのまとめの過程です.社長が見たいのは一つのまとめの結果です.まとめをするときは、一時的なまとめ結果を記憶する場所が必要です.メモはこの仕事に使います.moもmapです.初期値は空です.
var reduced = score.reduce(mapped, function(memo, element, index){
score.each(element, function(value, key, list){
if(memo[key]){
memo[key]+=value;
}else{
memo[key]=value;
}
});
return memo;
}, {});
console.log();
console.log(reduced);
参照リンクUnderscor公式サイト