首页 > 解决方案 > 使用 JavaScript 连接 2 个具有不同主键的 JSON 对象

问题描述

我有 2 个 json 数组,我需要将它们连接在一起。

但是如何将 2 个 JSON 数组与具有不同键值(ServerName 和 ComputerName)的 JAvascript 连接起来?

var servers = {
  0:{ServerName:"PC1", OS:"Windows", PRPName: "NO_PRP", SLA: "gold"}, 
  1:{ServerName:"PC2", OS:"Linux", PRPName: "NO_PRP", SLA: "silver"},
  2:{ServerName:"PC3", OS:"Windows", PRPName: "NO_PRP", SLA: "bronz"},
  3:{ServerName:"PC4", OS:"Windows", PRPName: "NO_PRP", SLA: "gold"}, 
  4:{ServerName:"PC5", OS:"Linux", PRPName: "NO_PRP", SLA: "bronz"},
  5:{ServerName:"PC6", OS:"Windows", PRPName: "NO_PRP", SLA: "bronz"}
};

var computers = {
  0:{Name:"PC1", location:"Amsterdam", PatchStatus: "true", RebootPending: "true"}, 
  1:{Name:"PC2", location:"London", PatchStatus: "true", RebootPending: "true"},
  2:{Name:"PC3", location:"Berlin", PatchStatus: "true", RebootPending: "false"},
  3:{Name:"PC4", location:"Berlin", PatchStatus: "false", RebootPending: "true"},
  4:{Name:"PC5", location:"London", PatchStatus: "true", RebootPending: "false"},
  5:{Name:"PC6", location:"Amsterdam", PatchStatus: "true", RebootPending: "true"}
};

结果需要是:

var endresult= {
  0:{Name:"PC1", location:"Amsterdam", PatchStatus: "true", RebootPending: "true", OS:"Windows", PRPName: "NO_PRP", SLA: "gold"}, 
  1:{Name:"PC2", location:"London", PatchStatus: "true", RebootPending: "true", OS:"Linux", PRPName: "NO_PRP", SLA: "silver"},
  2:{Name:"PC3", location:"Berlin", PatchStatus: "true", RebootPending: "false", OS:"Windows", PRPName: "NO_PRP", SLA: "bronz"},
  3:{Name:"PC4", location:"Berlin", PatchStatus: "false", RebootPending: "true", OS:"Windows", PRPName: "NO_PRP", SLA: "gold"},
  4:{Name:"PC5", location:"London", PatchStatus: "true", RebootPending: "false", OS:"Linux", PRPName: "NO_PRP", SLA: "bronz"},
  5:{Name:"PC6", location:"Amsterdam", PatchStatus: "true", RebootPending: "true", OS:"Windows", PRPName: "NO_PRP", SLA: "bronz"}
};

标签: javascriptjson

解决方案


您可以遍历计算机数组并使用Array.find()通过比较名称属性来查找匹配的服务器。

然后使用扩展运算符合并两个条目。

var servers = {
"servers":[
  {"ServerName":"PC1", "OS":"Windows"}, 
  {"ServerName":"PC2", "OS":"Linux"},
  {"ServerName":"PC3", "OS":"Windows"}
]
}

var computers = {
"computers":[
  {"ComputerName":"PC1", "location":"Amsterdam"}, 
  {"ComputerName":"PC2", "location":"London"},
  {"ComputerName":"PC3", "location":"Berlin"}
]
}

var mergedObject = {computers: []};

for(var computer of computers.computers){

  var server = (({ OS }) => ({ OS }))(servers.servers.find(function(server){return server.ServerName === computer.ComputerName}));
  // Get only "OS" property of server
  
  var cmp = {...computer, ...server};
  mergedObject.computers.push(cmp);
}

console.log(mergedObject);


更新

根据OP的第二个问题,我将片段更新如下:

var servers = {
  0:{ServerName:"PC1", OS:"Windows", PRPName: "NO_PRP", SLA: "gold"}, 
  1:{ServerName:"PC2", OS:"Linux", PRPName: "NO_PRP", SLA: "silver"},
  2:{ServerName:"PC3", OS:"Windows", PRPName: "NO_PRP", SLA: "bronz"},
  3:{ServerName:"PC4", OS:"Windows", PRPName: "NO_PRP", SLA: "gold"}, 
  4:{ServerName:"PC5", OS:"Linux", PRPName: "NO_PRP", SLA: "bronz"},
  5:{ServerName:"PC6", OS:"Windows", PRPName: "NO_PRP", SLA: "bronz"},
  6:{ServerName:"PC7", OS:"Windows", PRPName: "NO_PRP", SLA: "bronz"},
};

var computers = {
  0:{Name:"PC1", location:"Amsterdam", PatchStatus: "true", RebootPending: "true"}, 
  1:{Name:"PC2", location:"London", PatchStatus: "true", RebootPending: "true"},
  2:{Name:"PC3", location:"Berlin", PatchStatus: "true", RebootPending: "false"},
  3:{Name:"PC4", location:"Berlin", PatchStatus: "false", RebootPending: "true"},
  4:{Name:"PC5", location:"London", PatchStatus: "true", RebootPending: "false"},
  5:{Name:"PC6", location:"Amsterdam", PatchStatus: "true", RebootPending: "true"},
  6:{Name:"PC9", location:"Amsterdam", PatchStatus: "true", RebootPending: "true"}
};

// Please note that Objects must have a key, so I added 0, 1, 2 etc as keys.

var mergedArray = [];

for(var computer of Object.values(computers)){

  var findItem = Object.values(servers).find(function(server){return server.ServerName === computer.Name});
  if(!findItem){
    continue;
  }
  
  var {ServerName, ...server} = findItem;
  // {ServerName, ...server} is  called "desctructring". You set "ServerName" property in "ServerName" a variable 
  // and all the other properties to "server" variable
  
  var cmp = {...computer, ...server};
  mergedArray.push(cmp);
}

console.log(mergedArray);

希望这可以帮助。


推荐阅读