簡體   English   中英

使用d3.nest()在JavaScript中對數組求和

[英]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),並且prevcurr是數組的第一和第二個元素。 由於您只有一個元素,因此無法以這種形式調用它。

如果對第二個參數使用reduce:

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

它實際調用的功能,與所述第一呼叫通過i等於0,並且prev等於{ foo:'bar' }

所以我想您有2個選擇:

  1. 要么修改它以傳遞第二個參數,在您的情況下,第二個參數就必須是{ values:[0,0] } (並且對values始終為2個元素的事實進行硬編碼,如果更長則會引起問題)。

  2. 檢查group.length == 1 ,如果是,則return group ,而不是調用reduce。

暫無
暫無

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

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