es6 - javascript 将多个JSON对象合并成一个(带子父关系)

查看:1510
本文介绍了es6 - javascript 将多个JSON对象合并成一个(带子父关系)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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"}]}]

是否有好的办法?

解决方案

额,就是不想写循环


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));

这篇关于es6 - javascript 将多个JSON对象合并成一个(带子父关系)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆