问题描述
|
我将如何转换此平面json结构:
[
[\"a\",\"b\",\"c\"],[\"a\",\"d\"],[\"c\",\"e\"],\"f\"]
]
使用javascript进入以下图形结构?
{\"uri\": \"a\",\"subItems\": [
{\"uri\": \"b\",\"subItems\": [
{\"uri\": \"c\",\"subItems\": [
{\"uri\": \"b\",\"subItems\": [
{\"uri\": \"e\"},{\"uri\": \"f\"}
]}
]},{\"uri\": \"d\"}
]}
]}
解决方法
我认为这应该使您真正接近。它将整个JSON结果包装在一个数组中,这样做是为了简化getNode函数,但是您可以轻松地获取数组的[0]索引。我开始尝试遵循JSLint(因此,i = i + 1而不是i ++),但是我放弃了一半,因此可以对代码进行一些清理。 ;)
http://jsfiddle.net/Zcyca/
var i,j,k,arr =
[
[\"a\",\"b\",\"c\"],[\"a\",\"d\"],[\"c\",\"e\"],\"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;
}
, 似乎没有“轻松”的方式。
我不确定如何处理需要找到另一个匹配项的地方,例如,如果要添加ѭ3should应该去哪里?第二层还是第四层的“ b”?
http://jsfiddle.net/qVFCe/3/
var data = [
[\"a\",\"f\"]
];
var group = null;
var baseStructure = {
\"uri\": null,\"subItems\": []
};
function find(parent,uri) {
for (var i = 0; parent.subItems && i < parent.subItems.length; i++) {
if (parent.subItems[i].uri == uri) {
return parent.subItems[i];
}
}
return null;
}
function findRecursive(parent,uri) {
var i,obj;
//look in children
for (i = 0; parent.subItems && i < parent.subItems.length; i++) {
obj = find(parent.subItems[i],uri);
if (obj !== null) {
return obj;
}
}
//look recursively in children
for (i = 0; parent.subItems && i < parent.subItems.length; i++) {
obj = findRecursive(parent.subItems[i],uri);
if (obj !== null) {
return obj;
}
}
return null;
}
for (var i = 0; (group = data[i]); i++) {
var current = baseStructure;
for (var j = 0; j < group.length; j++) {
var obj = find(current,group[j]);
if (obj === null && j === 0) {
obj = findRecursive(current,group[j]);
}
if (obj === null) {
//create a new one if not found
obj = {
uri: group[j]
};
if(current.subItems === undefined)
{
current.subItems = [];
}
current.subItems.push(obj);
}
current = obj;
}
}