簡體   English   中英

Javascript的reduce()函數有哪些優點? (和map())

[英]What are the advantages of Javascript's reduce() function? (and map())

我正在嘗試決定是否在Javascript中使用reduce()方法來處理我需要編寫的函數,這是類似的東西

var x = [some array], y = {};
for (...) {
    someOperation(x[i]);
    y[x[i]] = "some other value";
}

現在這可以通過以下方式寫成reduce()函數:

x.reduce(function(prev, current, index, arr) {
    someOperation(current);
    prev[current] = "some other value";
    return prev;
}, {})

或類似的東西。 這兩者之間有任何表現或其他差異嗎? 或者其他一些原因(例如瀏覽器支持),因為在Web編程環境中哪一個應該優先於另一個? 謝謝。

即使我更喜歡這些操作(縮小,映射,過濾等),但由於某些瀏覽器在其實現中不支持它們,因此使用它們仍然不可行。 當然,你可以通過擴展Array原型來“修補”它,但這也是一堆蠕蟲。

我不認為這些函數存在任何固有的錯誤,我認為它們可以提供更好的代碼,但是現在最好不要使用它們。 一旦更高百分比的人口使用支持這些功能的瀏覽器,我認為他們將是公平的游戲。

就性能而言,由於函數調用的開銷,這些可能比為循環手寫更慢。

mapfilterreduce以及forEach和...(更多信息: https//developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array#Iteration_methods )遠遠優於普通循環,因為:

  1. 它們更優雅
  2. 他們鼓勵函數式編程(參見函數式編程的好處)
  3. 你需要這么寫的功能,並通過放進去,作為參數,迭代變量。 這是因為javascript沒有塊范圍。 mapreduce等函數使您的工作變得更加容易,因為它們會自動設置迭代變量並將其傳遞給您的函數。

IE9聲稱支持這些。 他們是官方的javascript / ecmascript規范。 如果你關心使用IE8的人,這是你的特權。 如果你真的在乎,你可以通過覆蓋只有IE8及更舊版本的Array.prototype來破解它,以“修復”IE8及更舊版本。

reduce用於從數組返回一個值,作為順序處理前一個元素的結果的結果。

reduceRight做同樣的事情,但從最后開始並向后工作。

map用於返回其成員全部通過函數傳遞的數組。

這兩種方法都不會影響數組本身

var A1 = ['1','2','3','4','5','6','7','8'];

//這個map的使用返回原始元素的新數組,轉換為數字 -

A1 = A1.map(數量); // >> A1的每個元素都轉換為數字

//這減少了數組元素 -

var A1sum = A1.reduce(function(a,b){return a + b;});

// A1sum >>返回值:(Number)36

舊瀏覽器不支持它們,因此您需要替換它們。 如果你所做的一切都可以在一個簡單的循環中復制,那就不值得了。

確定人口的標准差是一個可以有效地使用地圖和減少的例子 -

Math.mean= function(array){
    return array.reduce(function(a, b){ return a+b; })/array.length;
}
Math.stDeviation=function(array){
    var mean= Math.mean(array);
    dev= array.map(function(itm){return (itm-mean)*(itm-mean); });
    return Math.sqrt(dev.reduce(function(a, b){ return a+b; })/array.length);
}


var A2= [6.2, 5, 4.5, 6, 6, 6.9, 6.4, 7.5];
alert ('mean: '+Math.mean(A2)+'; deviation: '+Math.stDeviation(A2))

kennebec - 很好,但你的stDeviation函數調用reduce兩次並映射一次只需要一次調用reduce (這使得它快得多):

Math.stDev = function (a) {
    var n = a.length;
    var v = a.reduce(function (v, x) {
      v[0] += x * x;
      v[1] += x;
      return v;
    }, [0,0]);
    return Math.sqrt( (v[0] - v[1]*v[1] / n) / n );
}

在分配給v [1]時應該轉換為數字以確保字符串數字不會與結果混淆,並且在大多數情況下最后一行中的除數可能是(n-1),但這取決於OP 。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM