2016-05-11 3 views
4

Learn JS Data与え、分割適用コンバイン)(d3.nestにキーと値の名前を変更し

[{"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}}] 

になり

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

での例は、出力を変換する簡単な方法はあります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}] 
のような出力を生成し、平坦化されるように巣から

This questionと思われますが、提供されたフィドルの解決策は一般化するのが難しいです。

答えて

6

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

とにかくハードコードに適しています):

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; 
    }); 
関連する問題