如何匹配payload中两个lines数组的number并替换labelnumber值
需求说明
需要根据payload.lines.number = payload.notification.body.lines.number的匹配规则,将notification.body.lines中的labelnumber值替换为主lines数组中对应number的labelnumber值,同时保留notification.body中的其他元素(如示例中的date)不变。
输入Payload
{ "date": "2022-11-15T19:24:36.871Z", "lines": [ { "number": "123", "labelnumber":"ABC", "received": "2022-11-15T19:30:17.955Z" }, { "number": "456", "labelnumber":"DFG", "received": "2022-11-15T19:30:57.426Z" }, { "number": "789", "labelnumber":"HIJ", "received": "2022-11-15T19:31:49.042Z" } ], "notification":{ "body":{ "date": "2022-11-15T19:24:36.871Z", "lines": [ { "number": "123", "labelnumber":"", "received": "2022-11-15T19:30:17.955Z" }, { "number": "123", "labelnumber":"", "received": "2022-11-15T19:30:57.426Z" }, { "number": "456", "labelnumber":"", "received": "2022-11-15T19:31:49.042Z" }, { "number": "789", "labelnumber":"", "received": "2022-11-15T19:31:49.042Z" }, { "number": "789", "labelnumber":"", "received": "2022-11-15T19:31:49.042Z" } ] } } }
预期Payload
{ "date": "2022-11-15T19:24:36.871Z", "lines": [ { "number": "123", "labelnumber":"ABC", "received": "2022-11-15T19:30:17.955Z" }, { "number": "456", "labelnumber":"DFG", "received": "2022-11-15T19:30:57.426Z" }, { "number": "789", "labelnumber":"HIJ", "received": "2022-11-15T19:31:49.042Z" } ], "notification":{ "body":{ "date": "2022-11-15T19:24:36.871Z", "lines": [ { "number": "123", "labelnumber":"ABC", "received": "2022-11-15T19:30:17.955Z" }, { "number": "123", "labelnumber":"ABC", "received": "2022-11-15T19:30:57.426Z" }, { "number": "456", "labelnumber":"DFG", "received": "2022-11-15T19:31:49.042Z" }, { "number": "789", "labelnumber":"HIJ", "received": "2022-11-15T19:31:49.042Z" }, { "number": "789", "labelnumber":"HIJ", "received": "2022-11-15T19:31:49.042Z" } ] } } }
解决方案
实现思路
- 先将主
lines数组转换为以number为键、labelnumber为值的映射对象,快速匹配对应值,避免重复遍历主数组提升效率。 - 遍历
notification.body.lines数组,根据每个元素的number从映射对象中取出对应labelnumber赋值。 - 保留原Payload所有结构与其他元素不变。
代码示例(JavaScript)
// 输入的原始payload const payload = { "date": "2022-11-15T19:24:36.871Z", "lines": [ { "number": "123", "labelnumber":"ABC", "received": "2022-11-15T19:30:17.955Z" }, { "number": "456", "labelnumber":"DFG", "received": "2022-11-15T19:30:57.426Z" }, { "number": "789", "labelnumber":"HIJ", "received": "2022-11-15T19:31:49.042Z" } ], "notification":{ "body":{ "date": "2022-11-15T19:24:36.871Z", "lines": [ { "number": "123", "labelnumber":"", "received": "2022-11-15T19:30:17.955Z" }, { "number": "123", "labelnumber":"", "received": "2022-11-15T19:30:57.426Z" }, { "number": "456", "labelnumber":"", "received": "2022-11-15T19:31:49.042Z" }, { "number": "789", "labelnumber":"", "received": "2022-11-15T19:31:49.042Z" }, { "number": "789", "labelnumber":"", "received": "2022-11-15T19:31:49.042Z" } ] } } }; // 创建number与labelnumber的映射表 const labelMap = payload.lines.reduce((map, line) => { map[line.number] = line.labelnumber; return map; }, {}); // 替换notification.body.lines中的labelnumber payload.notification.body.lines.forEach(line => { if (labelMap[line.number]) { line.labelnumber = labelMap[line.number]; } }); // 输出处理后的结果 console.log(JSON.stringify(payload, null, 2));
说明
- 映射表仅需遍历一次主
lines数组,后续匹配均为O(1)时间复杂度,大数据量场景下效率更高。 - 代码仅修改
notification.body.lines中的labelnumber字段,原Payload其他结构与元素完全保留。 - 若
notification.body.lines中存在主lines未匹配的number,将保留原labelnumber值,兼容边界情况。
内容的提问来源于stack exchange,提问作者Jesus Abraham Felix González
相关产品推荐
相关产品推荐

