मान लें कि आपको डेटा का पालन करना है (पहले से ही डीबी से लोड किया गया है):
var data = [
{ _id: "MongoDB", children: [] },
{ _id: "Postgres", children: [] },
{ _id: "Databases", children: [ "MongoDB", "Postgres" ] },
{ _id: "Languages", children: [] },
{ _id: "Programming", children: [ "Databases", "Languages" ] },
{ _id: "Books", children: [ "Programming" ] }
];
चूंकि _id
अद्वितीय है, तो पहले चरण में आप इसे शब्दकोश में बदल देते हैं, जहां कुंजी आईडी हैं:
var dct = {};
for (var i = 0; i < data.length; i++) {
var doc = data[i];
dct[doc._id] = doc;
}
अब आप data
. के माध्यम से लूप करें एक बार और सरणी और बच्चों को सेट करें:
for (var i = 0; i < data.length; i++) {
var doc = data[i];
var children = doc.children;
var ref_children = [];
for (var j = 0; j < children.length; j++) {
var child = dct[children[j]]; // <-- here's where you need the dictionary
ref_children.push(child);
}
doc.children = ref_children;
}
और वोइला, आपका काम हो गया:
JSON.stringify(data);
संपादित करें
यदि आप केवल जड़ें चाहते हैं (नोड्स जो किसी अन्य नोड के बच्चे नहीं हैं), तो पहले आपको उन्हें ढूंढना होगा:
var get_parent = function(node, docs) {
for (var i = 0; i < docs.length; i++) {
var doc = docs[i];
if (doc.children.indexOf(node) != -1) {
return doc;
}
}
return null;
};
var roots = [];
for (var i = 0; i < docs.length; i++) {
var doc = data[i];
if (get_parent(doc, docs) === null) {
roots.push(doc);
}
}
JSON.stringify(roots);
बच्चों को संदर्भित करते समय माता-पिता को स्टोर करना अधिक कुशल तरीका होगा (संपादित करें ऊपर दिए गए कोड के साथ तुलना करें):
for (var i = 0; i < data.length; i++) {
var doc = data[i];
var children = doc.children;
var ref_children = [];
for (var j = 0; j < children.length; j++) {
var child = dct[children[j]]; // <-- here's where you need the dictionary
child.has_parent = true; // <-- has a parent
ref_children.push(child);
}
doc.children = ref_children;
}
var roots = [];
for (var i = 0; i < data.length; i++) {
var doc = data[i];
if (!doc.has_parent) {
roots.push(doc);
}
}
JSON.stringify(roots);