2017-08-15 40 views
1

誰可以在簡單的英語中好心解釋累加器acc的構造?Javascript減少累加器解釋

return arr1.reduce(function(acc, curr){ 
    var last = acc[acc.length-1]; 
    if(acc.length > 0 && curr[1]===last[1]) { 
    last[0] += curr[0]; 
    } 
    else acc.push(curr); 
    return acc; 
    }, []); 
} 

這減少方法可以用來解決FreeCodeCamp「庫存更新」任務,作爲其先進的算法腳本課的一部分。

鏈接:https://www.freecodecamp.org/challenges/inventory-update。 需要更新庫存數組(arr1)中的現有項目,並使用「新交貨」數組中的新項目進行更新。

兩個測試陣列,當前庫存curInv和新的交付分別newInv,可能如下:

var curInv = [ 
[21, "Bowling Ball"], 
[2, "Dirty Sock"], 
[1, "Hair Pin"], 
[5, "Microphone"] 
]; 

var newInv = [ 
[2, "Hair Pin"], 
[3, "Half-Eaten Apple"], 
[67, "Bowling Ball"], 
[7, "Toothpaste"] 
]; 

發現JavaScript的一些優秀的文章減少方法(例如this post和一個偉大的後視頻課程on egghead.io),並以某種方式感應它的功耗,我會讀取方法如下:

「通過創建一個空數組[] f來減少庫存數組irst(初始值),然後應用以下回調函數:
如果庫存數組當前不是空的(長度大於零),並且當前處理的項目的名稱(curr的索引0可能爲「Bowling Ball 「例如)與正在更新的庫存數組的最後一項相同,然後更新庫存數組中的該物料的數量。
最後一項定義在if語句正上方,如下所示:取當前累計數組的長度,減去1,並使用此值爲累積數組編制索引。然後將該索引處的元素分配給變量'last'。另一方面,如果庫存爲空,則完全添加新項目,即:項目名稱和金額。 現在返回新積累陣「

如何使用長度 - ?累加器,使ACC實際上積累有用的1 (原諒押韻)

我想我明白大部分如何這種減少方法建立,但請大家指正無論我誤讀),除了這個特殊的 使用acc.length-1。

乾杯,K。

+0

這個減速機是如何解決這個問題的?你能分享實際的電話嗎? – thedude

+0

@thedude:一種解決方案似乎是將reduce方法與concat結合起來,並按字母順序排序,如[Repl.it link](https://repl.it/KKgZ/0) –

回答

0

實際的解決方案包括串聯和排序這兩個數組,然後才減少它們。 在這種情況下,每當我們評估一個新項目時,如果它的名字不等於最後的累加器項目,這意味着它是一個新項目。使用

你的榜樣,我們正在減少的列表是:

[ 
    [ 21, 'Bowling Ball' ], 
    [ 67, 'Bowling Ball' ], 
    [ 2, 'Dirty Sock' ], 
    [ 1, 'Hair Pin' ], 
    [ 2, 'Hair Pin' ], 
    [ 3, 'Half-Eaten Apple' ], 
    [ 5, 'Microphone' ], 
    [ 7, 'Toothpaste' ] 
] 

所以當我們遇到的第二個項目,在蓄壓器的最後一個值是[21, 'Boweling Ball'],當我們比較字符串我們進入第一個條件。

+0

對!謝謝,看到減少列表使它點擊; '保齡球'作爲'最後'項目意味着當下一個'保齡球'出現時,功能增加1 –

0

你詢問這個部分?

var last = acc[acc.length-1]; 

如果是這樣acc.length-1是因爲在一個數組

acc = [a,b,c,d] 
acc.length is equal to 4 

訪問元素d您將通過

acc[3]; //which equals d 

那是因爲我們指望從位置訪問0,1,2,3