/ / Javascript Rekursywnie Dodawanie do właściwego miejsca - javascript, rekursja

JavaScript Rekursywnie Dodawanie do właściwego miejsca - javascript, rekursja

Nie mogę dostać mojego add_child funkcja wepchnięcia się we właściwe miejsce. To dlatego, że mój mózg ma problemy z rekurencją. Czy jakakolwiek dusza może pomóc w ustaleniu, co muszę zrobić?

Uważam, że muszę śledzić, jak głęboko w globalnej sieci, a następnie dodać dziecko jak self.data[key][i].push({...}); ale wydaje mi się, że nie jest to właściwe.

Tutaj jest mój jsFiddle

W przeciwnym razie tutaj wywołuję funkcję dodawania niektórych węzłów:

var m = new Map();
m.add(1);
m.add(2);
m.add(3);
m.add(4, 3);
m.add(5, 3);
m.add(6, 5);
m.add(7, 5);

console.log(m.data)

Przykład tego, co próbuję wyprodukować:

  [
{
node_id: 0,
children: null
},
{
node_id: 1,
children: [
{
node_id: 2
children: null
},
{
node_id: 3
children: [

}
]
},
]

To moja funkcja wywołująca:

var Map = function() {

var self = this;
this.data = [];

this.add = function(node_id, parent_id) {

if (typeof parent_id == "number") {
self.add_child(node_id, parent_id, self.data);
return;
}

self.data.push({
"node_id": node_id,
"children": []
});

return true;
}

this.add_child = function(node_id, needle, haystack) {

for (var key in haystack)
{
if (haystack[key].children.length != 0)
{
self.add_child(node_id, needle, haystack[key].children);
}
else
{
if (haystack[key].node_id == needle)
{
//console.log("Searching for needle: " + needle)
//console.log("Found it in: " + key)

//console.log("The Actual Data:")
//console.log(self.data[key]);

self.data[key].children.push({
"node_id": node_id,
"children": []
});
break;
}
}
}
}

};

Odpowiedzi:

2 dla odpowiedzi № 1

Jeśli usuniesz inny warunek, powinieneś to zrobićpodstęp, nie najskuteczniejsza rzecz na świecie, ponieważ będziesz chodzić większość drzewa, najlepiej jak to zrobić z binarnego drzewa wyszukiwania, np. czerwone czarne drzewo

http://jsfiddle.net/vhqxk/

        for (var key in haystack)
{
if (haystack[key].children.length != 0)
{
self.add_child(node_id, needle, haystack[key].children);
}

if (haystack[key].node_id == needle)
{
haystack[key].children.push({
"node_id": node_id,
"children": []
});
break;
}
}

1 dla odpowiedzi nr 2

Było kilka błędów, tutaj działa kod, po prostu funkcja add_child

this.add_child = function(node_id, needle, haystack) {
if (!haystack) { return; }
for (var key in haystack) {
// you need to check if haystack[key].children is not undefined
if (haystack[key].children && haystack[key].children.length != 0) {
self.add_child(node_id, needle, haystack[key].children);
} else {
if (haystack[key].node_id == needle) {
// initialize children if null
if (!haystack[key].children) {
haystack[key].children = [];
}
// append to haystack
haystack[key].children.push({
"node_id": node_id,
"children": []
});
break;
}
}
}
};

Przetestowane z Twoimi danymi:

var data = [
{
node_id: 0,
children: null
},
{
node_id: 1,
children: [
{
node_id: 2,
children: null
},
{
node_id: 3,
children: []

}
]
},
];

var map = new Map();
map.add_child(10, 0, data);
console.log(JSON.stringify(data));