javascript - 使用 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"}
};
解决方案
您可以遍历计算机数组并使用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);
希望这可以帮助。
推荐阅读
- dart - 如何使用 RadioListTiles 制作可扩展的 ListView?
- php - git push 时现有的 apache PHP 进程会发生什么?
- string - 为什么 Powershell 说 System.Drawing.Point 不包含名为 split 的方法。
- wordpress - GeoIP 根据用户位置 WordPress 自动更改货币
- python - 来自现有数据框的数据框字典
- php - 如何在产品类别的 echo 中添加 ACF PRO image src="" & alt=""
- javascript - 羽毛应用程序未在 localhost:3030 中启动
- sql-server - 抑制严重级别 10 消息 SQL Server
- awk - awk:匹配字段并将常量值插入矩阵
- python - 如何从多个 SQL 文件创建一个 SQL 表?