2015-09-18 46 views
1

我不確定我應該看看哪些函數來實現我想要做的。可能減少是不正確的。減少每個不同對象的對象數組和總和屬性

數據庫查詢返回的對象的列表像這樣的:

result = [{group1: 'A', group2: 'A', SUM: 5}, 
      {group1: 'A', group2: 'B', SUM: 2}, 
      {group1: 'C', groupe2: 'B', SUM: 3} 
     ] 

我想「減少」或「基團」這個陣列以獲得對象爲每個不同的group1group2值和SUM相對它喜歡低於該對象:

wanted = [{group1: 'A', group1_SUM: 7, group2: 'A', group2_SUM: 5}, 
      {group1: 'B', group1_SUM: 0, group2: 'B', group2_SUM: 5}, 
      {group1: 'C', group1_SUM: 3, group2: 'C', group2_SUM: 0} 
     ] 

,或者也可以是:

wanted = [{groupName: 'A', group1_SUM: 7, group2_SUM: 5}, 
      {groupName: 'B', group1_SUM: 0, group2_SUM: 5}, 
      {groupName: 'C', group1_SUM: 3, group2_SUM: 0} 
     ] 
+0

一種方法是創建一個新的數組,循環「結果」並將唯一組推送到該數組中。更新你的錢數。 –

+0

這個問題的具體部分是你遇到了什麼問題?你的代碼目前是什麼樣的,它是如何失敗的? – StriplingWarrior

+0

@BelowtheRadar,你試圖做的甚至不清楚。 –

回答

2

第一個函數減少result以查找每個組的總和。

然後我們通過每個組返回結果。

var result = [{group1: 'A', group2: 'A', SUM: 5}, 
    {group1: 'A', group2: 'B', SUM: 2}, 
    {group1: 'C', group2: 'B', SUM: 3} 
]; 

(function groupSum(result) { 
    var sums = result.reduce(function(a, e) { 
    a.group1_SUM[e.group1] = (a.group1_SUM[e.group1] || 0) + e.SUM; 
    a.group2_SUM[e.group2] = (a.group2_SUM[e.group2] || 0) + e.SUM; 
    return a; 
    }, {group1_SUM: {}, group2_SUM: {}}); 

    return Array.from(new Set(Object.keys(sums.group1_SUM).concat(Object.keys(sums.group2_SUM)))).map(function(e) { 
    return { 
     groupName: e, group1_SUM: sums.group1_SUM[e] || 0, group2_SUM: sums.group2_SUM[e] || 0 
    } 
    }); 
})(result); 
+0

不錯的工作,打我吧! – azium

+0

@BelowtheRadar將整個片段複製並粘貼到控制檯中。返回一個3個對象的數組,就像你問的那樣 – azium