重命名d3.nest()中的键和值

ARM*_*ARM 4 javascript d3.js

学习JS数据给出和split-apply-combine的例子

var expenseMetrics = d3.nest()
  .key(function(d) { return d.name; })
  .rollup(function(v) { return {
    count: v.length,
    total: d3.sum(v, function(d) { return d.amount; }),
    avg: d3.mean(v, function(d) { return d.amount; })
  }; })
  .entries(expenses);
console.log(JSON.stringify(expenseMetrics));
Run Code Online (Sandbox Code Playgroud)

结果

[{"key":"jim","values":{"count":2,"total":79,"avg":39.5}},
 {"key":"carl","values":{"count":1,"total":120.11,"avg":120.11}},
 {"key":"stacy","values":{"count":3,"total":90.9,"avg":30.3}}]
Run Code Online (Sandbox Code Playgroud)

是否有任何简单的方法来转换嵌套的输出,使其key具有自定义名称并被展values平,产生类似的输出

[{"name":"jim","count":2,"total":79,"avg":39.5},
 {"name":"carl","count":1,"total":120.11,"avg":120.11},
 {"name":"stacy","count":3,"total":90.9,"avg":30.3}]
Run Code Online (Sandbox Code Playgroud)

这个问题似乎有关,但提供的小提琴中的解决方案很难概括.

mee*_*mit 8

没有办法d3.nest()做到这一点(至少在版本3中没有;在v4中添加它的可能性很小,但我对此表示怀疑).

但你肯定可以这样做:

var expenseMetrics = d3.nest()
  ...
  .entries(expenses)
  .map(function(group) {
    return {
      name: group.key,
      count: group.values.count,
      total: group.values.total,
      avg:   group.values.avg
    }
  });
Run Code Online (Sandbox Code Playgroud)

如果你想要它更通用,你可以得到与上面相同的输出,而无需硬编码任何东西(除了key => name mapping,它适用于硬编码):

var expenseMetrics = d3.nest()
  ...
  .entries(expenses)
  .map(function(group) {
    var merged = { name: group.key };

    // Copy each key-val pair of group.values into merged
    Object.keys(group.values).forEach(function(key) {
      merged[key] = group.values[key];
    });

    return merged;
  });
Run Code Online (Sandbox Code Playgroud)