Monday, 15 March 2010

javascript - D3 nesting data with arbitrary depth -



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