簡體   English   中英

Array.prototype.reduce與一個簡單的for循環,用於過濾和修改數據

[英]Array.prototype.reduce vs a simple for loop for filtering and modifying data

Elijah Manor的“減少過濾器並向下映射以減少”概述了Array.prototype.reduce()的以下用例:

給定以下數據(來自鏈接的文章):

var doctors = [
    { number: 1,  actor: "William Hartnell",      begin: 1963, end: 1966 },
    { number: 2,  actor: "Patrick Troughton",     begin: 1966, end: 1969 },
    { number: 3,  actor: "Jon Pertwee",           begin: 1970, end: 1974 },
    { number: 4,  actor: "Tom Baker",             begin: 1974, end: 1981 },
    { number: 5,  actor: "Peter Davison",         begin: 1982, end: 1984 },
    { number: 6,  actor: "Colin Baker",           begin: 1984, end: 1986 },
    { number: 7,  actor: "Sylvester McCoy",       begin: 1987, end: 1989 },
    { number: 8,  actor: "Paul McGann",           begin: 1996, end: 1996 },
    { number: 9,  actor: "Christopher Eccleston", begin: 2005, end: 2005 },
    { number: 10, actor: "David Tennant",         begin: 2005, end: 2010 },
    { number: 11, actor: "Matt Smith",            begin: 2010, end: 2013 },
    { number: 12, actor: "Peter Capaldi",         begin: 2013, end: 2013 }    
];

我們可以使用.reduce()同時修改和過濾數據,如下所示(同樣來自鏈接的文章):

doctors = doctors.reduce(function(memo, doctor) {
    if (doctor.begin > 2000) { // this serves as our `filter`
        memo.push({ // this serves as our `map`
            doctorNumber: "#" + doctor.number,
            playedBy: doctor.actor,
            yearsPlayed: doctor.end - doctor.begin + 1
        });
    }
    return memo;
}, []);

但是,為什么會比簡單的for循環更喜歡呢? 我懷疑它的性能優於具有相似內容的簡單迭代循環(盡管由於Jsperf down ,所以我無法測試該聲明)。

除了語法首選項之外,是否有任何理由(性能或其他方式)在簡單的循環上使用.reduce()實現?

mapreduce這樣的數組操作的一個客觀好處是固有的變量作用域和樣板代碼的減少。 相比:

var result = 0;
for (var i = 0, length = arr.length; i < length; i++) {
    result += arr[i];
}

// vs:

var result = arr.reduce(function (acc, val) { return acc + val; }, 0);

巨型循環聲明與您在此處嘗試執行的操作本質上無關,只是樣板代碼。 此外,您的作用域現在還有兩個其他變量ilength浮動,沒有人在周圍詢問,如果您不小心的話,可能會或可能不會引入一些非顯而易見的錯誤。

另一方面, reduce代碼僅包含執行所需操作所需的最少部分。 在類似CoffeeScript之類的東西中,其語法甚至可以進一步簡化為arr.reduce (acc, val) -> acc + val ,這arr.reduce (acc, val) -> acc + val簡明了。 並且即使您需要在循環/回調內部的操作過程中創建其他變量,這些變量也不會使外部范圍混亂。

其次, reduce是眾所周知的范例,可以很好地說明該代碼塊的意圖。 您無需解析無用的輔助變量並弄清楚它們的用途,您只需將操作分解為要對哪個數組進行操作( arr )以及回調表達式( acc + val )會產生什么結果,然后在整個數組上外推,以了解結果。

這種潛在的操作也可以更好地在某些情況下編譯器優化,但是這主要是在實踐中沒有在這個時候,我相信看到。

暫無
暫無

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

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