Python中合并同FROM字段的JSON数组MESSAGE元素的实现方法
合并相同FROM字段的邮件MESSAGE数组问题
需求描述
你有一组嵌套的邮件JSON数据,当多个邮件项的FROM字段值相同时,需要将它们的MESSAGE数组合并,其他字段可以保留第一个匹配项的值(比如SUBJECT、DATE等,你提到可以暂不处理DATE)。
原始输入:
[ [ { "TO": "nathanoluwaseyi@gmail.com", "FROM": "johndoe@gmail.com", "SUBJECT": "This is the subject 1", "MESSAGE": ["First Message"], "NAME": "John Doe", "DATE": "2019-08-18 19:48:10" }, { "TO": "nathanoluwaseyi@gmail.com", "FROM": "johndoe@gmail.com", "SUBJECT": "This is the subject 2", "MESSAGE": ["Second message"], "NAME": "John Doe", "DATE": "2019-08-18 19:48:10" } ] ]
期望输出:
[ [ { "TO": "nathanoluwaseyi@gmail.com", "FROM": "johndoe@gmail.com", "SUBJECT": "This is the subject 1", "MESSAGE": ["First Message", "Second Message"], "NAME": "John Doe", "DATE": "2019-08-18 19:48:10" } ] ]
实现方案(以JavaScript为例)
核心思路是按FROM字段分组,遍历过程中合并MESSAGE数组,最后再重组为目标格式。具体代码如下:
// 原始输入数据 const originalData = [ [ { "TO": "nathanoluwaseyi@gmail.com", "FROM": "johndoe@gmail.com", "SUBJECT": "This is the subject 1", "MESSAGE": ["First Message"], "NAME": "John Doe", "DATE": "2019-08-18 19:48:10" }, { "TO": "nathanoluwaseyi@gmail.com", "FROM": "johndoe@gmail.com", "SUBJECT": "This is the subject 2", "MESSAGE": ["Second message"], "NAME": "John Doe", "DATE": "2019-08-18 19:48:10" } ] ]; // 第一步:取出内层的邮件数组(因为原始数据是嵌套数组) const emails = originalData[0]; // 第二步:创建一个临时对象来分组,键为FROM的值 const groupedEmails = {}; // 第三步:遍历所有邮件项 emails.forEach(email => { const fromKey = email.FROM; if (groupedEmails[fromKey]) { // 如果该FROM已存在,合并MESSAGE数组 groupedEmails[fromKey].MESSAGE = [...groupedEmails[fromKey].MESSAGE, ...email.MESSAGE]; } else { // 如果不存在,复制当前邮件项到分组中(用展开运算符做浅拷贝,避免引用问题) groupedEmails[fromKey] = {...email}; } }); // 第四步:将分组对象的值转为数组,再包装成原始的嵌套格式 const result = [Object.values(groupedEmails)]; console.log(JSON.stringify(result, null, 2));
补充说明
- 这里用浅拷贝
{...email}来复制邮件项,避免后续修改影响原始数据;如果你的邮件项有更深层次的嵌套对象,需要用深拷贝(比如JSON.parse(JSON.stringify(email)))。 - 其他字段(比如
SUBJECT)会保留第一个匹配项的值,如果你需要处理这些字段(比如合并或取最新),可以在遍历的时候额外添加逻辑。 - 如果使用其他编程语言(比如Python),思路是完全一致的:用字典按
FROM分组,遍历合并数组,最后转换为目标格式。
内容的提问来源于stack exchange,提问作者Eniayomi
相关产品推荐
相关产品推荐

