I have a data like this: https://jsfiddle.net/L79wjn0x/, and I would like to convert it in this format https://jsfiddle.net/49n1jmL5/. I am trying to make use of d3.nest
method to change the format but unable to make it work. In my data children are linked with parent through parents'id.
Sample data I have is like below. Children are linked with parent
through parent's id that is children's parent_id
key is same that of
parent's id key.
[{
"id": 1,
"name": "ab",
"parent_id": null,
"value": 120,
"tree_level": 1
},
{
"id": 2,
"name": "ac",
"parent_id": null,
"value": 110,
"tree_level": 1
} {
"id": 3,
"name": "abc",
"parent_id": 1,
"value": 30,
"tree_level": 2
},
{
"id": 4,
"name": "abcd",
"parent_id": 1,
"value": 90,
"tree_level": 2
},
{
"id": 5,
"name": "abc",
"parent_id": 3,
"value": 10,
"tree_level": 3
},
{
"id": 6,
"name": "abc",
"parent_id": 3,
"value": 20,
"tree_level": 3
}
]
and i would like the above json format to be converted like below format. Can anyone lead me to the correct way
{
"id": 1,
"name": "ab",
"parent_id": null,
"value": 120,
"tree_level": 1,
children: [{
"id": 3,
"name": "abc",
"parent_id": 1,
"value": 30,
"tree_level": 2
children: [{
"id": 5,
"name": "abc",
"parent_id": 3,
"value": 10,
"tree_level": 3
},
{
"id": 6,
"name": "abc",
"parent_id": 3,
"value": 20,
"tree_level": 3
}
]
},
{
"id": 4,
"name": "abcd",
"parent_id": 1,
"value": 90,
"tree_level": 2,
children: []
}
]
}, {
"id": 2,
"name": "ac",
"parent_id": null,
"value": 110,
"tree_level": 1,
children: []
}
Below is the code which I wrote to convert but it doesn't work for me. It is not creating children inside, instead creating it outside.
var nested = d3.nest()
.key(function(d) {
if (d.parent_id === null)
return d;
}).rollup(function(ele) {
return ele.map(function(c) {
return {
"id": c.id,
"parent_id": c.parent_id,
"name": c.name,
"logValue": c.logValue,
"tree_level": c.tree_level
};
});
}).entries(this.dataset);
console.log(nested)
will d3.nest() work or i need something else ?
For passing that data to d3.partition()
, which you'll use to create the sunburst, all you need is d3.stratify
. In your case:
const stratify = d3.stratify()
.parentId(function(d) {
return d.parent_id;
});
const hierarchicalData = stratify(data);
Here is the demo (use your browser's console to see the object, not the S.O. snippet's one):
const data = [{
"id": 131567,
"name": "cellular organisms",
"tree_level": 1,
"display_order": 2,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": null
},
{
"id": 2759,
"name": "Eukaryota",
"tree_level": 2,
"display_order": 5,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 131567
},
{
"id": 33154,
"name": "Opisthokonta",
"tree_level": 3,
"display_order": 49,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 2759
}, {
"id": 33208,
"name": "Metazoa",
"tree_level": 4,
"display_order": 126,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 33154
}, {
"id": 6072,
"name": "Eumetazoa",
"tree_level": 5,
"display_order": 227,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 33208
}, {
"id": 33213,
"name": "Bilateria",
"tree_level": 6,
"display_order": 547,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 6072
}, {
"id": 33511,
"name": "Deuterostomia",
"tree_level": 7,
"display_order": 950,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 33213
}, {
"id": 7711,
"name": "Chordata",
"tree_level": 8,
"display_order": 1639,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 33511
}, {
"id": 89593,
"name": "Craniata",
"tree_level": 9,
"display_order": 3042,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 7711
}, {
"id": 7742,
"name": "Vertebrata",
"tree_level": 10,
"display_order": 3614,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 89593
}, {
"id": 7776,
"name": "Gnathostomata",
"tree_level": 11,
"display_order": 4245,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 7742
}, {
"id": 117570,
"name": "Teleostomi",
"tree_level": 12,
"display_order": 4684,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 7776
}, {
"id": 117571,
"name": "Euteleostomi",
"tree_level": 13,
"display_order": 4994,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 117570
}, {
"id": 8287,
"name": "Sarcopterygii",
"tree_level": 14,
"display_order": 5175,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 117571
}, {
"id": 1338369,
"name": "Dipnotetrapodomorpha",
"tree_level": 15,
"display_order": 5787,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 8287
}, {
"id": 32523,
"name": "Tetrapoda",
"tree_level": 16,
"display_order": 5945,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 1338369
}, {
"id": 32524,
"name": "Amniota",
"tree_level": 17,
"display_order": 6322,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 32523
}, {
"id": 40674,
"name": "Mammalia",
"tree_level": 18,
"display_order": 6556,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 32524
}, {
"id": 32525,
"name": "Theria",
"tree_level": 19,
"display_order": 6705,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 40674
}, {
"id": 9347,
"name": "Eutheria",
"tree_level": 20,
"display_order": 6882,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 32525
}, {
"id": 1437010,
"name": "Boreoeutheria",
"tree_level": 21,
"display_order": 7254,
"has_data": "N",
"is_leaf": "N",
"value": 18314,
"parent_id": 9347
}, {
"id": 314145,
"name": "Laurasiatheria",
"tree_level": 22,
"display_order": 7469,
"has_data": "N",
"is_leaf": "N",
"value": 48,
"parent_id": 1437010
}, {
"id": 314146,
"name": "Euarchontoglires",
"tree_level": 22,
"display_order": 7470,
"has_data": "N",
"is_leaf": "N",
"value": 18281,
"parent_id": 1437010
}, {
"id": 9443,
"name": "Primates",
"tree_level": 23,
"display_order": 7575,
"has_data": "N",
"is_leaf": "N",
"value": 17686,
"parent_id": 314146
}, {
"id": 33554,
"name": "Carnivora",
"tree_level": 23,
"display_order": 7598,
"has_data": "N",
"is_leaf": "N",
"value": 11,
"parent_id": 314145
}, {
"id": 91561,
"name": "Cetartiodactyla",
"tree_level": 23,
"display_order": 7629,
"has_data": "N",
"is_leaf": "N",
"value": 37,
"parent_id": 314145
}, {
"id": 314147,
"name": "Glires",
"tree_level": 23,
"display_order": 7675,
"has_data": "N",
"is_leaf": "N",
"value": 741,
"parent_id": 314146
}, {
"id": 9845,
"name": "Ruminantia",
"tree_level": 24,
"display_order": 7760,
"has_data": "N",
"is_leaf": "N",
"value": 16,
"parent_id": 91561
}, {
"id": 9989,
"name": "Rodentia",
"tree_level": 24,
"display_order": 7762,
"has_data": "N",
"is_leaf": "N",
"value": 741,
"parent_id": 314147
}, {
"id": 35497,
"name": "Suina",
"tree_level": 24,
"display_order": 7776,
"has_data": "N",
"is_leaf": "N",
"value": 21,
"parent_id": 91561
}, {
"id": 376913,
"name": "Haplorrhini",
"tree_level": 24,
"display_order": 7857,
"has_data": "N",
"is_leaf": "N",
"value": 17686,
"parent_id": 9443
}, {
"id": 379584,
"name": "Caniformia",
"tree_level": 24,
"display_order": 7859,
"has_data": "N",
"is_leaf": "N",
"value": 11,
"parent_id": 33554
}, {
"id": 9655,
"name": "Mustelidae",
"tree_level": 25,
"display_order": 7931,
"has_data": "N",
"is_leaf": "N",
"value": 11,
"parent_id": 379584
}, {
"id": 9821,
"name": "Suidae",
"tree_level": 25,
"display_order": 7938,
"has_data": "N",
"is_leaf": "N",
"value": 21,
"parent_id": 35497
}, {
"id": 35500,
"name": "Pecora",
"tree_level": 25,
"display_order": 7956,
"has_data": "N",
"is_leaf": "N",
"value": 16,
"parent_id": 9845
}, {
"id": 314293,
"name": "Simiiformes",
"tree_level": 25,
"display_order": 8029,
"has_data": "N",
"is_leaf": "N",
"value": 17686,
"parent_id": 376913
}, {
"id": 1963758,
"name": "Myomorpha",
"tree_level": 25,
"display_order": 8054,
"has_data": "N",
"is_leaf": "N",
"value": 741,
"parent_id": 9989
}, {
"id": 9479,
"name": "Platyrrhini",
"tree_level": 26,
"display_order": 8101,
"has_data": "N",
"is_leaf": "N",
"value": 251,
"parent_id": 314293
}, {
"id": 9526,
"name": "Catarrhini",
"tree_level": 26,
"display_order": 8102,
"has_data": "N",
"is_leaf": "N",
"value": 17435,
"parent_id": 314293
}, {
"id": 9822,
"name": "Sus",
"tree_level": 26,
"display_order": 8108,
"has_data": "N",
"is_leaf": "N",
"value": 21,
"parent_id": 9821
}, {
"id": 9895,
"name": "Bovidae",
"tree_level": 26,
"display_order": 8112,
"has_data": "N",
"is_leaf": "N",
"value": 16,
"parent_id": 35500
}, {
"id": 169418,
"name": "Mustelinae",
"tree_level": 26,
"display_order": 8190,
"has_data": "N",
"is_leaf": "N",
"value": 11,
"parent_id": 9655
}, {
"id": 337687,
"name": "Muroidea",
"tree_level": 26,
"display_order": 8202,
"has_data": "N",
"is_leaf": "N",
"value": 741,
"parent_id": 1963758
}, {
"id": 9665,
"name": "Mustela",
"tree_level": 27,
"display_order": 8256,
"has_data": "N",
"is_leaf": "N",
"value": 11,
"parent_id": 169418
}, {
"id": 9823,
"name": "Sus scrofa",
"tree_level": 27,
"display_order": 8261,
"has_data": "N",
"is_leaf": "N",
"value": 21,
"parent_id": 9822
}, {
"id": 10066,
"name": "Muridae",
"tree_level": 27,
"display_order": 8267,
"has_data": "N",
"is_leaf": "N",
"value": 741,
"parent_id": 337687
}, {
"id": 27592,
"name": "Bovinae",
"tree_level": 27,
"display_order": 8277,
"has_data": "N",
"is_leaf": "N",
"value": 16,
"parent_id": 9895
}, {
"id": 314295,
"name": "Hominoidea",
"tree_level": 27,
"display_order": 8339,
"has_data": "N",
"is_leaf": "N",
"value": 17435,
"parent_id": 9526
}, {
"id": 9604,
"name": "Hominidae",
"tree_level": 28,
"display_order": 8386,
"has_data": "N",
"is_leaf": "N",
"value": 17435,
"parent_id": 314295
}, {
"id": 9668,
"name": "Mustela putorius",
"tree_level": 28,
"display_order": 8389,
"has_data": "N",
"is_leaf": "N",
"value": 11,
"parent_id": 9665
}, {
"id": 9903,
"name": "Bos",
"tree_level": 28,
"display_order": 8395,
"has_data": "N",
"is_leaf": "N",
"value": 16,
"parent_id": 27592
}, {
"id": 39107,
"name": "Murinae",
"tree_level": 28,
"display_order": 8420,
"has_data": "N",
"is_leaf": "N",
"value": 741,
"parent_id": 10066
}, {
"id": 9669,
"name": "Mustela putorius furo",
"tree_level": 29,
"display_order": 8545,
"has_data": "N",
"is_leaf": "N",
"value": 11,
"parent_id": 9668
}, {
"id": 9913,
"name": "Bos taurus",
"tree_level": 29,
"display_order": 8547,
"has_data": "N",
"is_leaf": "N",
"value": 16,
"parent_id": 9903
}, {
"id": 10088,
"name": "Mus",
"tree_level": 29,
"display_order": 8556,
"has_data": "N",
"is_leaf": "N",
"value": 3,
"parent_id": 39107
}, {
"id": 10114,
"name": "Rattus",
"tree_level": 29,
"display_order": 8557,
"has_data": "N",
"is_leaf": "N",
"value": 740,
"parent_id": 39107
}, {
"id": 207598,
"name": "Homininae",
"tree_level": 29,
"display_order": 8606,
"has_data": "N",
"is_leaf": "N",
"value": 17435,
"parent_id": 9604
}, {
"id": 9605,
"name": "Homo",
"tree_level": 30,
"display_order": 8684,
"has_data": "N",
"is_leaf": "N",
"value": 17435,
"parent_id": 207598
}, {
"id": 9606,
"name": "Homo sapiens",
"tree_level": 31,
"display_order": 8808,
"has_data": "N",
"is_leaf": "N",
"value": 17435,
"parent_id": 9605
}
];
const stratify = d3.stratify()
.parentId(function(d) {
return d.parent_id;
});
const hierarchicalData = stratify(data);
console.log(hierarchicalData)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>