2015-10-07 82 views
0

我需要重新安排我的JSON数组中的下列方式。在输出中,我需要id为重点和对象本身,因为它的价值。需要重新安排JSON

输入:

[ 
    { 
     "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

输出,我建议创建一个新的普通对象并遍历您的JSON,并在新的对象创建所需的结构而不是试图“更新”输入对象。你真的没有断裂语句进行递归函数 –

回答

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": [] 
      } 
     }] 
    } 
}] 
+0

嗨Gilsha,感谢您的回答。在第二级,它创建的对象的键为“未定义”。我之前没有使用'map',所以我试图弄明白。 – benjamin54

+0

你好本杰明。我无法重现您提到的问题。我已经添加了一个格式化的输出到答案。这不是预期的产出吗?我找不到任何带有未定义键的对象。 – Gilsha