1、目前有一個很任性的介面API,它提供的資料非常不合理
2、資料如下
var json = [{"mainId": 1, "title": "abc", "createdate": "2017-06-28"},{"mainId": 2, "title": "ddddd", "createdate": "2017-06-25"}];
var json1 = [{"childId":1, "mainId": 1, "childname": "cname"},{"childId":2, "mainId": 1, "childname": "cname2"},{"childId":3, "mainId": 2, "childname": "cname3"},{"childId":4, "mainId": 2, "childname": "cname4"}];
var json2 = [{"childchildId":1, "childId": 1, "childname": "cname"},{"childchildId":2, "childId": 1, "childname": "cname2"},{"childchildId":3, "childId": 2, "childname": "cname3"},{"childchildId":4, "childId": 2, "childname": "cname4"},{"childchildId":5, "childId": 3, "childname": "cname"},{"childchildId":6, "childId": 3, "childname": "cname2"},{"childchildId":7, "childId": 4, "childname": "cname3"},{"childchildId":8, "childId": 4, "childname": "cname4"}];
3、我想將它們合併成一個json如下:
var result = [{"mainId":1, "title": "abc", "createdate": "2017-06-28", child:[{"childId":1, "mainId": 1, "childname": "cname", childchild:[{"childchildId":1, "childId": 1, "childname": "cname"},{"childchildId":2, "childId": 1, "childname": "cname2"}]},{"childId":2, "mainId": 1, "childname": "cname2", childchild:[{"childchildId":3, "childId": 2, "childname": "cname3"},{"childchildId":4, "childId": 2, "childname": "cname4"}]}]
是否有好的辦法?
PHP中文网2017-06-30 10:00:35
額,就是不想寫循環
let json2Obj = json2.reduce((acc, cur) => {
let childId = cur.childId;
if (!acc[childId]) {
acc[childId] = [];
}
acc[childId].push(cur);
return acc;
}, {})
json1.forEach(item => {
item.childchild = json2Obj[item.childId]
})
let json1Obj = json1.reduce((acc, cur) => {
let mainId = cur.mainId;
if (!acc[mainId]) {
acc[mainId] = [];
}
acc[mainId].push(cur);
return acc;
}, {})
json.forEach(item => {
item.child = json1Obj[item.mainId];
})
console.log(JSON.stringify(json));
reduce重構下:
const toObj = (json, idStr) => json.reduce((acc, cur) => {
let id = cur[idStr];
if (!acc[id]) {
acc[id] = [];
}
acc[id].push(cur);
return acc;
}, {})
const json2Obj = toObj(json2, 'childId');
json1.forEach(item => item.childchild = json2Obj[item.childId])
const json1Obj = toObj(json1, 'mainId');
json.forEach(item => item.child = json1Obj[item.mainId])
console.log(JSON.stringify(json));
滿天的星座2017-06-30 10:00:35
php的,一步步來
header('content-type:application/json;charset=utf8');
$json = '[{"mainId": 1, "title": "abc", "createdate": "2017-06-28"},{"mainId": 2, "title": "ddddd", "createdate": "2017-06-25"}]';
$json1 = '[{"childId":1, "mainId": 1, "childname": "cname"},{"childId":2, "mainId": 1, "childname": "cname2"},{"childId":3, "mainId": 2, "childname": "cname3"},{"childId":4, "mainId": 2, "childname": "cname4"}]';
$json2 = '[{"childchildId":1, "childId": 1, "childname": "cname"},{"childchildId":2, "childId": 1, "childname": "cname2"},{"childchildId":3, "childId": 2, "childname": "cname3"},{"childchildId":4, "childId": 2, "childname": "cname4"},{"childchildId":5, "childId": 3, "childname": "cname"},{"childchildId":6, "childId": 3, "childname": "cname2"},{"childchildId":7, "childId": 4, "childname": "cname3"},{"childchildId":8, "childId": 4, "childname": "cname4"}]';
$arr = array_merge(json_decode($json, true), json_decode($json1, true), json_decode($json2, true));
print_r(json_encode(dataFormat($arr)));
//整理数据格式
function dataFormat($arr){
foreach ($arr as $key => &$value) {
$value['id'] = $key;
}
foreach ($arr as $key => &$value) {
if (!empty($value['mainId']) && empty($value['childId'])) {
$value['pid'] = '100';
}
if (!empty($value['mainId']) && !empty($value['childId'])) {
foreach ($arr as $k => $v) {
if (!empty($v['mainId']) && empty($v['childId'])) {
if ($value['mainId'] == $v['mainId']) {
$value['pid'] = $k;
}
}
}
}
if (!empty($value['childchildId'])) {
foreach ($arr as $k => $v) {
if (!empty($v['mainId']) && !empty($v['childId'])) {
if ($value['childId'] == $v['childId']) {
$value['pid'] = $k;
}
}
}
}
}
//生成树
$arr = getTree($arr);
//删除id、pid
deleteKey($arr, 'id', 'pid');
return $arr;
//删除不需要的键id、pid
}
//获取树
function getTree($items){
$tree = array();
foreach($items as $item){
if(isset($items[$item['pid']])){
$items[$item['pid']]['child'][] = &$items[$item['id']];
}else{
$tree[] = &$items[$item['id']];
}
}
return $tree;
}
//删除不需要的键
function deleteKey(&$arr, $id, $pid){
foreach ($arr as $key => &$value) {
if (!empty($value['child']) && is_array($value['child'])) {
deleteKey($value['child'], $id, $pid);
}
unset($value[$id], $value[$pid]);
}
}
正常輸出
[
{
"mainId": 1,
"title": "abc",
"createdate": "2017-06-28",
"child": [
{
"childId": 1,
"mainId": 1,
"childname": "cname",
"child": [
{
"childchildId": 1,
"childId": 1,
"childname": "cname"
},
{
"childchildId": 2,
"childId": 1,
"childname": "cname2"
}
]
},
{
"childId": 2,
"mainId": 1,
"childname": "cname2",
"child": [
{
"childchildId": 3,
"childId": 2,
"childname": "cname3"
},
{
"childchildId": 4,
"childId": 2,
"childname": "cname4"
}
]
}
]
},
{
"mainId": 2,
"title": "ddddd",
"createdate": "2017-06-25",
"child": [
{
"childId": 3,
"mainId": 2,
"childname": "cname3",
"child": [
{
"childchildId": 5,
"childId": 3,
"childname": "cname"
},
{
"childchildId": 6,
"childId": 3,
"childname": "cname2"
}
]
},
{
"childId": 4,
"mainId": 2,
"childname": "cname4",
"child": [
{
"childchildId": 7,
"childId": 4,
"childname": "cname3"
},
{
"childchildId": 8,
"childId": 4,
"childname": "cname4"
}
]
}
]
}
]
伊谢尔伦2017-06-30 10:00:35
let obj1 = {};
let obj={}
let obj2 = eval('(' + (JSON.stringify(obj) + JSON.stringify(obj1)).replace(/}{/, ',') + ')');
很好用的,不過瀏覽器可能會提示eval是有害的,這個想要去掉,可以百度有方法,具體我忘了