2016-01-17 50 views
2

我剛纔瞭解了MapReduce的,所以我不知道是否有書面的MapReduce在JavaScript

const initialValue = 0; 

if (this.items) { 
    return this.items.filter(function (item) { 
    return item && item.quantity && item.price; 
    }).reduce(function(previousValue, currentValue) { 
    return previousValue + currentValue.quantity * currentValue.price ; 
    }, initialValue); 
} else { 
    return initialValue; 
} 

,而不是僅僅

let total = 0; 
if (this.items) { 
    this.items.forEach(function(item) { 
    if (item && item.quantity && item.price) { 
     total += item.quantity * item.price; 
    } 
    }); 
} 
return total; 
+0

首先可以肯定的是慢。你也可以使用for循環使第二個更快 – CoderPi

+0

如果你使用MapReduce只是爲了累積值(以迭代方式),那麼第一個和第二個沒有什麼優勢。不過別忘了,MapReduce背後的想法是用於並行計算(分佈式系統/集羣)。所以如果'forEach'沒有被設計出來,實現並行運行,那麼它不適合分佈式環境,第二種解決方案不適用於並行計算,因此這兩種解決方案是完全不同的。 – pasty

回答

0

我看不到任何優勢第一的任何好處在第二*。然而,第二個更快,然後看起來更乾淨!第一個目的可能是演示如何使用內置的數組函數。

但是,mapreduce用於很多元素,所以你可以儘可能地加快速度。這應該是你可以得到最快的:

const initialValue = 0; 
let total = initialValue; 
if (this.items) { 
    for (var i = this.items.length; i--;) { 
    let item = this.items[i] 
    if (item && item.quantity && item.price) { 
     total += item.quantity * item.price; 
    } 
    } 
    return total; 
} else { 
    return initialValue 
} 

在addtion你可以放下if內循環,如果你知道你的陣列是consitant。這兩個if都只是爲了確保數組已正確構建並且腳本不會運行到錯誤中,這對於用戶數據輸入將非常有用,但在封閉的系統中,您不需要它們。


* 我注意到,二是缺少默認值return initialValue