以 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);
})();