javascript - D3 nesting data with arbitrary depth -
i have info construction looks below , want nest create d3 treemap. able nest using either underscore.nest
or d3.nest()
. however, because info has arbitrary depth, end bunch of undefined nodes. how can nest arbitrary depth or rollup
undefined nodes?
// illustration info info = [ {'name' : 'post 1', '0' : 'tag_a'}, {'name' : 'post 2', '0' : 'tag_b'}, {'name' : 'post 3', '0' : 'tag_b', '1' : 'tag_c'}, {'name' : 'post 4', '0' : 'tag_d', '1' : 'tag_e', '2' : 'tag_f', '3' : 'tag_g'} ]; // nesting underscore nest plugin var underscorenested = _.nest(data, ['0', '1', '2', '3']); { "children": [ { "name": "tag_a", "children": [ { "name": "undefined", "children": [ { "name": "undefined", "children": [ { "name": "undefined", "children": [ { "0": "tag_a", "name": "post 1" } ], "index": 0 } ], "index": 0 } ], "index": 0 } ], "index": 0 }... // nesting d3 var d3nested = d3.nest() .key(function(d) { homecoming d['0']; }) .key(function(d) { homecoming d['1']; }) .key(function(d) { homecoming d['2']; }) .key(function(d) { homecoming d['3']; }) .entries(data); [ { "key": "tag_a", "values": [ { "key": "undefined", "values": [ { "key": "undefined", "values": [ { "key": "undefined", "values": [ { "0": "tag_a", "name": "post 1" } ] } ] } ] } ] },...
i found nice solution here using burrow.js. works nicely d3 zoomable treemap example.
// nest rows keys array, requires underscore.js burrow = function (data) { // create simple nested object var object = {}; _(data).each(function(d) { var _object = object; // branch based on array of items, // arbitray depth/length, // in case tags array _(d.tags).each(function(element,index) { _object[element] = _object[element] || {}; _object = _object[element]; }); }); // recursively create children array function descend(object) { if (!_.isempty(object)) { var array = []; _(object).each(function(value, key) { var children = descend(value); if (!!children) { var branch = { name: key, children: children }; } else { var branch = { name: key, value: 1 }; } array.push(branch) }); // _.each homecoming array; } // if else homecoming false; }; // descend // nested objectect homecoming { name: "nested data", children: descend(object) }; };
javascript d3.js underscore.js treemap
No comments:
Post a Comment