2012-12-04 52 views
0

我最近發佈this question有關使用d3.nest在JavaScript中總結陣列()使用d3.nest總結陣列在JavaScript()第二部分

我有一個很好的解決方案(兩個事實),但事實證明,這兩種有一個問題適用於附加額外信息時:

data = [ 
    { 
    continent: 'africa', 
    country: 'gabon', 
    values: [1, 2] 
    }, { 
    continent: 'africa', 
    country: 'chad', 
    values: [3, 4] 
    }, { 
    continent: 'asia', 
    country: 'china', 
    values: [1, 2] 
    } 
]; 

sum_by = 'continent'; 

rollupAgg = function(data, sum_by) { 
    return d3.nest().key(function(d) { 
    return d[sum_by]; 
    }).rollup(function(group) { 
    return group.reduce(function(prev, cur, index, arr) { 
     return { 
     values: prev.values.map(function(d, i) { 
      return d + cur.values[i]; 
     }), 
     sum_by: sum_by  // additional information 
     }; 
    }); 
    }).entries(data); 
}; 

減少()如果只有一個組中排不運行,因此該返回如下:

[ 
    { 
    "key": "africa", 
    "values": { 
     "values": [4, 6], 
     "sum_by": "continent" 
    } 
    }, { 
    "key": "asia", 
    "values": { 
     "continent": "asia", 
     "country": "china", // country information shouldn't have been retained 
     "values": [1, 2] 
    }      // sum_by information should have been added 
    } 
]; 

您能否看到一種方法來修改此函數,以便返回所需的結果?

回答

1

直到現在我還沒有發現單個元素數組不會執行該函數;但它是有道理的,因爲你有一個PARAM使用:

[].reduce(function(prev, curr, i, arr) {});// <-- function is the only param 

如果使用單個PARAM使用,該行爲是執行函數的第一次,i等於1(不爲0),以及prevcurr是數組的第一個和第二個元素。由於您只有一個元素,因此無法以此形式調用它。

如果使用了第二個PARAM減少:

[].reduce(function(prev, curr, i, arr) {}, { foo:'bar' });// <-- 2nd param {foo:bar} 

它實際上調用該函數,以傳遞i等於0和prev等於{ foo:'bar' }第一個電話。

所以我想你有2種選擇:

  1. 要麼修改通過第2個PARAM,而你的情況將需要{ values:[0,0] }(和硬編碼的事實,values始終是2元,如果時間更長,這將導致問題)。

  2. 檢查group.length == 1是否爲return group而不是調用reduce。

+0

明白了。帶着選項2.非常感謝。 –