最近想找个Node.js的经典模块阅读阅读,一来磨练一下Javascript技能,二来加深对Node.js的理解。打开Node.js的registry页面,发现Underscore被使用的最多。开始阅读Underscore源码,很快就崩溃了,obj.length === +obj.length
,想死有没有?后来在stackoverflow上面找到答案。一路下来,对于我这个Java程序员来说,艰辛啊。以后谁还说javascript简单,我只有一个字,滚。javascript语法确实简单,但能延伸出无限种可能和用法,相信其中的一部分Brendan
Eich大神设计javascript的时候也没有想到。
吐槽完毕,生活还得继续。Underscore是一个常用函数类库,说白了,就是弥补javascript语言自身缺失的某些常用功能,在Node.js(Server)和浏览器(Client)环境都可以使用。值得一提的是,如果环境已经提供了此类函数,Underscore会直接委托给环境处理,兼顾了效率和普适性。
对里面的两个函数map和reduce比较感兴趣,原因很简单,容易联想到Hadoop里面的Map Reduce(哈哈,真实的故事是Jeff Dean受函数式编程的启发而发明了大数据的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的过程就是拆分任务的过程,把一个大的任务拆分为多个小的任务,单独处理。老板需要一份数据,吩咐手下的几个小兵,每个人分一个独立的模块,各自处理。这里的小任务应该处理逻辑相同,处理数据不同。至于各个小任务能否并行执行,要看环境。Node.js是单线程的,显然不会并行处理,这相当于老板只有一个属下,分多次安排给同一个属下小任务而已。Hadoop里面小任务一般情况在多个机器上面执行,显然并行处理,相当于老板有很多个属下,大家同时处理任务。先把段落拆分为单词,然后以单词为单位进行统计,统计结果放到一个map(事实上是一个object)里面。
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就是一个汇总的过程,老板要看的是一个汇总的结果。汇总的时候需要一个地方来存储临时的汇总结果,备忘录(memo)就用来干这一件事情,memo也是个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);
Underscore之Map Reduce,布布扣,bubuko.com
原文:http://blog.csdn.net/kimylrong/article/details/22414355