jQuery全面解剖系列(二)MapReduce于jQuery

今天是jQuery系列的第二篇,講MapReduce於jQuery。

何爲MapReduce

MapReduce是一種計算機理論,2004年由Google提出,目前已有很多應用。

MapReduce即爲映射化簡,分别爲兩種運算過程。簡單的說,我現在有一個輸入I,我想得到輸出O,我不是直接計算,而是先將I過拆分爲集合A,通過Map運算得到另一個集合B,再通過Reduce運算得到輸出O。

MapReduce的應用

爲什麽要多此一舉呢?這個理論是Google提出來的,Google肯定要用的到咯,試想,Google現在從Internetl上抓了100M個網頁,Google想知道這些網頁裏面文字和連接的比例是多少,但是一個小時之後就要算出來。哈哈,這個工作量可就够大的咯,要是那自家的電腦去算,估計算上一個月也不一定呢。自然Google也没有那麽高性能的服務器,但是Google有很多很多小服務器呀,如果他們一起工作來算這麽一個值,肯定很快咯。

這就是MapReduce的一個典型的應用場景了,我們知道,每個網頁其實是相互獨立的,計算是可以分開的,那麽我們要是能把這些網頁分配給不同的計算機去算,就能得到每個網頁中文字和鏈接的數量,最後匯總一下不就好了麽。

那麽MapReduce在這裡如何使用呢?假設我們有一個現成的MapReduce計算框架,那麽我們要做的事情就是寫兩個算法,Map算法的輸入是一個網頁的HTML,輸出是{"text_count": 文字數, "link_count": 鏈接數},Reduce算法的輸入是一個上一次Reduce的輸出和一個網頁Map運算的輸出,輸出也是這種結構的Object,每次Reduce要做的很簡單,就是把text_count和link_count累加,然後輸出就行了。最終運算的結果是所有網頁的文字數總和和鏈接數總和,我們只要拿計算器除一下就是我們要的值了是吧。

MapReduce和jQuery

如果你翻閱jQuery的API,你會找到jQuery.map函數的,卻没有jQuery.reduce。 jQuery.map的簽名是這樣的:

jQuery.map( array, callback(elementOfArray, indexInArray) ) Returns: Array
    Description: Translate all items in an array or object to new array of items.

jQuery.map( array, callback(elementOfArray, indexInArray) )
    array: The Array to translate.
    callback(elementOfArray, indexInArray): The function to process each item against. The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.

jQuery.map( arrayOrObject, callback( value, indexOrKey ) )
    arrayOrObject: The Array or Object to translate.
    callback( value, indexOrKey ): The function to process each item against. The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.

我們寫一段小程序玩一下:

var arr1 = [0, 1, 2, 3, 4];
var arr2 = $.map(arr1, function(value, index) {
    return value * value;
});
console.log(arr2);
輸出:

[0, 1, 4, 9, 16]

就是一個很簡單的2次元計算。

這個Map看上去還是蠻好用的,不過没有Reduce,Map實在是寂寞。 其實老早就有人給jQuery提過bug,希望jQuery能把這個功能加進去,但是一直都没加,不知道爲什麽,可能是覺得用處不大吧。 没办法,我們就自己動手吧。

$.extend({
    reduce: function(arr, callback, valueInitial) {
        $.each(arr, function(i, value) {
            valueInitial = callback.call(value, valueInitial, value, i);
        });
        return valueInitial;
    }
});
我們擴展了一個自定義的reduce函數,來玩一下

var arr1 = [0, 1, 3, 4];
var ret = $.reduce(arr1, function(lastValue, value, index) {
    if (lastValue) return lastValue + value;
    return value;
});
console.log(ret);
輸出:

8

就是一個很簡單的求和過程。

完。

转载于:https://my.oschina.net/i33/blog/91238

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值