Je pense que cela devrait vous rapprocher vraiment. Il encapsule le résultat JSON entier dans un tableau, ce qui a été fait pour simplifier la fonction getNode mais vous pouvez facilement saisir l'index [0] du tableau. J'ai commencé par essayer de me conformer à JSLint (d'où le i = i + 1 au lieu de i ++), mais j'ai abandonné à mi-chemin pour que le code puisse être nettoyé un peu. ;)
http://jsfiddle.net/Zcyca/
var i, j, k, arr =
[
["a","b","c"],
["a","b","d"],
["c","b","e"],
["c","b","f"]
];
var results = [];
var last = results;
for(i = 0; i < arr.length; i = i + 1) {
var subArr = arr[i];
var parentURI = subArr[0], middleURI = subArr[1], childURI = subArr[2];
var parent, middle, child;
// Find parent or create parent
parent = getNode(results, parentURI);
if(parent === null) {
results.push({"uri": parentURI, "subItems": []});
parent = results[results.length-1];
}
if(typeof parent["subItems"] === "undefined") {
parent["subItems"] = [];
}
// Find middle or create middle
middle = getNode(parent["subItems"], middleURI);
if(middle === null) {
parent["subItems"].push({"uri": middleURI, "subItems": []});
middle = parent["subItems"][parent["subItems"].length-1];
}
if(typeof middle["subItems"] === "undefined") {
middle["subItems"] = [];
}
// Find child or create child
child = getNode(middle["subItems"], childURI);
if(child === null) {
middle["subItems"].push({"uri": childURI});
//child = middle["subItems"][middle["subItems"].length-1];
}
}
document.write(JSON.stringify(results));
function getNode(arr, uri) {
var node = null;
(function recurseArr(arr) {
for(var i = 0; i < arr.length; i = i + 1) {
var obj = arr[i];
if(obj["uri"] === uri) {
node = arr[i];
break;
} else if(typeof obj["subItems"] !== "undefined") {
recurseArr(obj["subItems"]);
}
}
})(arr);
return node;
}
Pouvez-vous expliquer la structure que vous voulez de retour? L'exemple ne le fait pas tout à fait pour moi. –
Vos données sont-elles garanties de ne pas avoir de références circulaires? Qu'avez-vous eu jusqu'ici? – YXD
Donc, si le nom '" c "' existe déjà quelque part dans la structure, utilisez-le; sinon créer un nouveau nom de premier niveau? –