[英]Summing arrays in JavaScript using d3.nest() Part II
我最近發布了有關使用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);
};
如果該組中只有一行,則reduce()不會運行,因此將返回以下內容:
[
{
"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
}
];
您能看到一種修改此功能以使其返回所需結果的方法嗎?
直到現在我還沒有想到單元素數組將不會執行該函數; 但這很有意義,因為您使用的是單個參數:
[].reduce(function(prev, curr, i, arr) {});// <-- function is the only param
與單個參數一起使用時,其行為是第一次執行該函數時, i
等於1(而不是0),並且prev
和curr
是數組的第一和第二個元素。 由於您只有一個元素,因此無法以這種形式調用它。
如果對第二個參數使用reduce:
[].reduce(function(prev, curr, i, arr) {}, { foo:'bar' });// <-- 2nd param {foo:bar}
它實際調用的功能,與所述第一呼叫通過i
等於0,並且prev
等於{ foo:'bar' }
所以我想您有2個選擇:
要么修改它以傳遞第二個參數,在您的情況下,第二個參數就必須是{ values:[0,0] }
(並且對values
始終為2個元素的事實進行硬編碼,如果更長則會引起問題)。
檢查group.length == 1
,如果是,則return group
,而不是調用reduce。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.