我需要按照以下方式重新排列我的JSON数组。在输出中,我需要id
作为键,并将对象本身作为其值。
输入:
[
{
"id": "1",
"sub": [
{
"id": "1-1",
"sub": [
{
"id": "1-1-1",
"sub": []
}
]
},
{
"id": "1-2",
"sub": []
}
]
},
{
"id": "2",
"sub": []
},
{
"id": "3",
"sub": [
{
"id": "3-1",
"sub": []
}
]
}
]
输出:
{
"1": {
"id": "1",
"sub": {
"1-1": {
"id": "1-1",
"sub": {
"1-1-1": {
"id": "1-1-1",
"sub": []
}
}
},
"1-2": {
"id": "1-2",
"sub": []
}
}
},
"2": {
"id": "2",
"sub": []
},
"3": {
"id": "3",
"sub": {
"3-1": {
"id": "3-1",
"sub": []
}
}
}
}
我正在尝试使用递归,但它正在创建循环对象。
function rearrange(obj){
obj[obj.id] = obj;
for(var j = 0; j < obj.sub.length; j++){
obj.sub[j][obj.sub[j].id] = obj.sub[j];
if(obj.sub[j].sub.length > 0){
rearrange(obj.sub[j]);
}
}
}
//调用
rearrange(myobj);
答案 0 :(得分:2)
使用数组map
功能。 map()
方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。
var array = [{
"id": "1",
"sub": [{
"id": "1-1",
"sub": [{
"id": "1-1-1",
"sub": []
}]
}, {
"id": "1-2",
"sub": []
}]
}, {
"id": "2",
"sub": []
}, {
"id": "3",
"sub": [{
"id": "3-1",
"sub": []
}]
}];
function doMap(arr) {
var output = arr.map(function(d) {
var ob = {};
if (d.sub)
d.sub = doMap(d.sub);
ob[d.id] = d;
return ob;
});
return output;
};
alert(JSON.stringify(doMap(array)));
获得的输出
[{
"1": {
"id": "1",
"sub": [{
"1-1": {
"id": "1-1",
"sub": [{
"1-1-1": {
"id": "1-1-1",
"sub": []
}
}]
}
}, {
"1-2": {
"id": "1-2",
"sub": []
}
}]
}
}, {
"2": {
"id": "2",
"sub": []
}
}, {
"3": {
"id": "3",
"sub": [{
"3-1": {
"id": "3-1",
"sub": []
}
}]
}
}]