js如何将N个类似的JSON合并成一个

由于自己对于数据处理这块缺乏经验,所以遇到类似的问题就会懵逼,希望大神能够帮忙解答一下我的问题,谢谢。
具体描述如下:
1.目前有N多个json数据,是从接口中返回的,且不知道这个N是多少
2.返回的JSON数据,有一个共同点,就是title相同;而不同的title则需要合并成另外一个新的数据,具体如下

clipboard.png
图中这5个JSON,其中4个的title是一致的,只有最后一个是单独的,想要获得最终的数据结构如下

[
    {
        title: '蛮荒记(树下野狐)',
        details: [
            {
                page: {
                    from: 28,
                    to: 29
                },
                time: '2018-3-12 15:45',
                type: '标注'
            },
             {
                page: {
                    from: 28,
                    to: 29
                },
                time: '2018-3-12 15:45',
                type: '标注'
            },
             {
                page: {
                    from: 28,
                    to: 29
                },
                time: '2018-3-12 15:45',
                type: '标注'
            },
        ],
        snippet: [
            '半山红叶如火,层林尽染,被狂风呼卷,仿佛漫漫火海,摇曳跳跃。山坡上衰草起伏不绝,一直连绵到平原上,宛如接天汹涌海浪。',
            '精锐之师。其座下飞兽也是精挑细选的极为凶猛的灵兽,又经特殊培训,嗜血好杀,见着漫天凶兽,非但毫不畏缩,反倒激起狂暴凶性。',
            ...
        ]
    },
    {
        title: '炎武战神 (xiao少爷)',
        details: [
            {
                page: {
                    from: 2770,
                    to: 2771
                },
                time: '2018-5-10 10:25',
                type: '笔记'
            }
        ],
        snippet: [
            '这是一条测试的笔记内容'
        ]
    }
]

数据处理小白感谢大神的回复,希望大神不要吐槽我,谢谢

阅读 4.8k
3 个回答

以 TITLE 为 KEY,建立一个 MAP,如果 MAP 中找到指定的 KEY,把对应的数据取出来,合并 details 数组,没找到就把当前记录加进去。完成之后把 MAP 转成数组,如果要保留原顺序,在建 MAP 的同时建一个数组来保持顺序,注意 MAP 和数组的同步。

先思想下上面的思路,我晚点再来补代码


还要先恢复你的原始数据……下次问问题记得把原始数据贴出来

[
    {
        "title": "蛮荒记(树下野狐)",
        "details": {
            "page": {
                "from": 28,
                "to": 29
            },
            "time": "2018-3-12 15:45",
            "type": "标注"
        },
        "snippet": "半山红叶如火,层林尽染,被狂风呼卷,仿佛漫漫火海,摇曳跳跃。山坡上衰草起伏不绝,一直连绵到平原上,宛如接天汹涌海浪。"
    },
    {
        "title": "蛮荒记(树下野狐)",
        "details": {
            "page": {
                "from": 28,
                "to": 29
            },
            "time": "2018-3-12 15:45",
            "type": "标注"
        },
        "snippet": "精锐之师。其座下飞兽也是精挑细选的极为凶猛的灵兽,又经特殊培训,嗜血好杀,见着漫天凶兽,非但毫不畏缩,反倒激起狂暴凶性。"
    },
    {
        "title": "蛮荒记(树下野狐)",
        "details": {
            "page": {
                "from": 28,
                "to": 29
            },
            "time": "2018-3-12 15:45",
            "type": "标注"
        },
        "snippet": "测试笔记内容"
    },
    {
        "title": "炎武战神 (xiao少爷)",
        "details": {
            "page": {
                "from": 2770,
                "to": 2771
            },
            "time": "2018-5-10 10:25",
            "type": "笔记"
        },
        "snippet": "这是一条测试的笔记内容"
    }
]

然后才是处理代码

// source 引用的是原始数据
// target 是生成的新数据

const target = (() => {
    const dict = {};
    source.forEach(m => {
        let model = dict[m.title];
        if (model) {
            model.details.push(m.details);
            model.snippet.push(m.snippet);
        } else {
            dict[m.title] = {
                title: m.title,
                details: [m.details],
                snippet: [m.snippet]
            }
        }
    });
    return Object.values(dict);
})();
var resulte = []

/* 取到数据 data,合成*/
var hasitem = resulte.some(item=>{
    if(item.title == data.title){
        item.details.push(data.details)
    }
    return item.title == data.title
})
hasitem || resulte.push({
    title: data.title,
    details: [data.details]
})

第一:先提一个疑问,一个接口返回一个json吗,你这多少个接口呀,不合理吧。
第二:一个接口返回n个json,一个一个返回,直接在返回这里处理

//在外面定义一个数组
var arrList = [];
//单个返回处理
for(var i of arrList.keys()){
    if(arrList[i].title == json.title){
        (arrList[i].detail).push(json.detail)
    }else{
        var j = arrList.length;
        arrList[j].title = json.title
        arrList[j].detail = [];
        (arrList[j].detail).push(json.detail)
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题