我认为这应该让你非常接近。它将整个 JSON 结果包装在一个数组中,这样做是为了简化 getNode 函数,但您可以轻松地获取数组的 [0] 索引。我开始尝试遵循 JSLint(因此 i = i + 1 而不是 i++),但我在中途放弃了,因此可以稍微清理一下代码。;)
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;
}