0

最近、d3.nest() を使用して JavaScript で配列を合計することについて、この質問を投稿しました。

私は良い解決策を得ました(実際には2つ)が、追加情報を追加するように適応させると、両方に問題があることがわかりました:

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);
};

そのグループに行が 1 つしかない場合、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
  }
];

目的の結果が返されるようにこの関数を変更する方法がわかりますか?

4

1 に答える 1

1

単一の要素配列が関数を実行しないことは今まで思いつきませんでした。ただし、単一のパラメーターで使用しているため、理にかなっています。

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

単一のパラメーターで使用すると、関数が初めて実行されたときの動作はi1 (0 ではない) になりprevcurr配列の最初と 2 番目の要素になります。要素が 1 つしかないため、この形式で呼び出す方法はありません。

2 番目のパラメーターで reduce を使用する場合:

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

それは実際に関数を呼び出します。最初の呼び出しは 0 と等号に渡されiます。prev{ foo:'bar' }

したがって、2つのオプションがあると思います:

  1. あなたの場合は必要になる2番目のパラメータを渡すように変更してください{ values:[0,0] }(そして、それが常に2つの要素であるという事実をハードコーディングし、valuesそれが長くなると問題を引き起こします)。

  2. reduce を呼び出す代わりに、group.length == 1そうであるかどうかを確認します。return group

于 2012-12-05T00:15:11.703 に答える