UnderscoreのMap Reduce


最近Node.jsの経典モジュールを探して読みたいです.Javascriptの技能を磨いて、Node.jsの理解を深めます.Node.jsのregistryページを開けば、Underscoreが一番多く使われていることが分かります.Underscoreのソースコードを読み始めて、すぐに崩壊して、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.';
Map
Mapのプロセスはタスクを分割するプロセスであり、大きなタスクを複数の小さなタスクに分割して単独で処理します.支配人はデータを必要として、部下の何人かの小兵に命令して、それぞれ独立したモジュールを分けて、それぞれ処理します.ここでの小さなタスクは論理が同じで、処理データが違っています.各タスクが並行して実行できるかどうかは、環境次第です.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);
Reduce
Reduceは一つのまとめの過程です.社長が見たいのは一つのまとめの結果です.まとめをするときは、一時的なまとめ結果を記憶する場所が必要です.メモはこの仕事に使います.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公式サイト