You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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为键的映射对象,实现高效的匹配与覆盖,步骤如下:

  1. 把全局和自定义的connections数组分别转换为name -> 连接对象的映射
  2. 遍历全局映射,对每个项:若自定义映射中有同名项,则合并两个对象(自定义字段覆盖全局);若无则保留原项
  3. 遍历自定义映射,将全局映射中不存在的新项添加到结果中
  4. 将处理后的映射转回数组,组成最终的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:20:30