使用DataWeave合并两个数组并覆盖同名项值
JSON数组合并覆盖实现方案
需求说明:
- 合并全局JSON数组与自定义JSON数组,核心规则是当连接项的
name字段相同时,用自定义数组中的对应字段覆盖全局数组的字段 - 全局数组的所有项必须完整保留,自定义数组可仅包含
name及需要覆盖的字段,同时自定义数组中的新项(全局数组中无同名项)需添加到最终结果中
全局数组示例
{ "connections": [ { "name": "Test SFTP", "type": "SFTP", "user": "sftpuser", "password": "password", "server": "127.0.0.1", "port": 22 }, { "name": "Test FTP", "type": "FTP", "user": "ftpuser", "password": "password", "server": "127.0.0.1", "port": 21 } ] }
自定义数组示例
{ "connections": [ { "name": "Test SFTP", "user": "sftpuser1", "password": "password1", "server": "127.0.0.2" }, { "name": "Test FTPS", "type": "FTPS", "user": "ftpsuser", "password": "password", "server": "127.0.0.1", "port": 990 } ] }
实现逻辑(以JavaScript为例)
通过将数组转换为以name为键的映射对象,实现高效的匹配与覆盖,步骤如下:
- 把全局和自定义的
connections数组分别转换为name -> 连接对象的映射 - 遍历全局映射,对每个项:若自定义映射中有同名项,则合并两个对象(自定义字段覆盖全局);若无则保留原项
- 遍历自定义映射,将全局映射中不存在的新项添加到结果中
- 将处理后的映射转回数组,组成最终的JSON结构
// 全局JSON数据 const globalData = { "connections": [ { "name": "Test SFTP", "type": "SFTP", "user": "sftpuser", "password": "password", "server": "127.0.0.1", "port": 22 }, { "name": "Test FTP", "type": "FTP", "user": "ftpuser", "password": "password", "server": "127.0.0.1", "port": 21 } ] }; // 自定义JSON数据 const customData = { "connections": [ { "name": "Test SFTP", "user": "sftpuser1", "password": "password1", "server": "127.0.0.2" }, { "name": "Test FTPS", "type": "FTPS", "user": "ftpsuser", "password": "password", "server": "127.0.0.1", "port": 990 } ] }; // 转换为name映射 const globalMap = new Map(globalData.connections.map(item => [item.name, item])); const customMap = new Map(customData.connections.map(item => [item.name, item])); // 处理合并:先覆盖全局项,再添加自定义新项 const mergedConnections = []; // 覆盖全局已有项 globalMap.forEach((globalItem, name) => { const customItem = customMap.get(name); mergedConnections.push({ ...globalItem, ...customItem }); }); // 添加自定义新项 customMap.forEach((customItem, name) => { if (!globalMap.has(name)) { mergedConnections.push(customItem); } }); // 最终合并结果 const mergedResult = { connections: mergedConnections }; // 输出格式化后的结果 console.log(JSON.stringify(mergedResult, null, 2));
预期合并结果
{ "connections": [ { "name": "Test SFTP", "type": "SFTP", "user": "sftpuser1", "password": "password1", "server": "127.0.0.2", "port": 22 }, { "name": "Test FTP", "type": "FTP", "user": "ftpuser", "password": "password", "server": "127.0.0.1", "port": 21 }, { "name": "Test FTPS", "type": "FTPS", "user": "ftpsuser", "password": "password", "server": "127.0.0.1", "port": 990 } ] }
内容的提问来源于stack exchange,提问作者user20350110
相关产品推荐
相关产品推荐

