使用JavaScript连接具有不同主键的2个JSON对象

使用JavaScript连接具有不同主键的2个JSON对象,javascript,json,Javascript,Json,我有2个json数组,需要将它们连接在一起 但是如何将两个JSON数组与具有不同键值(ServerName和ComputerName)的JAvascript连接起来呢 结果必须是: var endresult= { 0:{Name:"PC1", location:"Amsterdam", PatchStatus: "true", RebootPending: "true", OS:"Windows", PRPName: "NO_PRP", SLA: "gold"}, 1:{Name:"

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

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

结果必须是:

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"}
};

您可以遍历computers数组,并使用通过比较名称属性来查找匹配的服务器

然后将两个条目与合并

var服务器={
“服务器”:[
{“服务器名”:“PC1”,“操作系统”:“Windows”},
{“ServerName”:“PC2”,“OS”:“Linux”},
{“服务器名”:“PC3”,“操作系统”:“Windows”}
]
}
变量计算机={
“计算机”:[
{“ComputerName”:“PC1”,“位置”:“阿姆斯特丹”},
{“ComputerName”:“PC2”,“地点”:“伦敦”},
{“计算机名”:“PC3”,“位置”:“柏林”}
]
}
var mergedObject={computers:[]};
用于(计算机的var计算机。计算机){
var server=({OS})=>({OS}))(servers.servers.find(函数(server){return server.ServerName===computer.ComputerName}));
//仅获取服务器的“OS”属性
var cmp={…计算机,…服务器};
mergedObject.computers.push(cmp);
}
console.log(mergedObject)这是我的方法

步骤1:建立一个索引。这将是一个对象,其键是每个服务器的
ServerName
属性的值,该值是服务器对象本身减去键-无需存储两次,实际上您将使用计算机中的键名,而不是服务器中的键名(它们是不同的:
ServerName
Name

从空对象
{}
开始,然后为每个服务器对象添加一个属性,该属性将
ServerName
映射到对象本身。这可以通过在数组上迭代的语法来完成

索引应如下所示:

{PC1:{OS:'Windows',PRPName:'NO_PRP',SLA:'gold'},
PC2:{OS:'Linux',PRPName:'NO_PRP',SLA:'silver'},
PC3:{OS:'Windows',PRPName:'NO_PRP',SLA:'bronz'},
PC4:{OS:'Windows',PRPName:'NO_PRP',SLA:'gold'},
PC5:{OS:'Linux',PRPName:'NO_PRP',SLA:'bronz'},
PC6:{OS:'Windows',PRPName:'NO_PRP',SLA:'bronz'}
第2步:加入。这意味着您返回一个数组,其中
计算机
数组的每个对象都成为一个包含计算机所有字段的对象,加上服务器上匹配
名称
值的所有字段。我们通过访问
索引[值]找到该对象
其中
计算机的值。名称

为了以一种干净的方式实现这一点,我们可以使用destructuring从对象中剥离连接属性名称

这里的代码实际上只有两个组成部分。一个是
for…of
用属性赋值来构建索引,另一个是
map
来连接表。其余的只是使用和语法来处理属性

编辑:因为您更改了问题中的源数据格式和键名,我添加了一个名为
arrayFromObject
的实用函数,将具有整数键的对象转换为数组,并更新了此答案的其余部分,以匹配新问题的具体内容

这里有一个完整的可运行代码段

var服务器={
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”}
};
变量计算机={
0:{名称:“PC1”,位置:“阿姆斯特丹”,补丁状态:“true”,重新启动挂起:“true”},
1:{名称:“PC2”,位置:“伦敦”,补丁状态:“真实”,重新启动待定:“真实”},
2:{名称:“PC3”,位置:“柏林”,补丁状态:“真”,重新启动挂起:“假”},
3:{名称:“PC4”,位置:“柏林”,补丁状态:“假”,重新启动挂起:“真”},
4:{名称:“PC5”,位置:“伦敦”,补丁状态:“真”,重新启动挂起:“假”},
5:{名称:“PC6”,位置:“阿姆斯特丹”,补丁状态:“真实”,重新启动挂起:“真实”}
};
//从对象的整数键生成数组
函数数组fromObject(obj){
让数组=[];
for(让x在obj中){
数组[+x]=obj[x];
}
返回数组;
}
设索引={};
对于arrayFromObject(servers)的({ServerName,…server}),索引[ServerName]=server;
让结果=arrayFromObject(计算机).map(
({Name,…computer})=>({Name,…computer,…index[Name]});

console.log(result);
Thx,可能是一个有点愚蠢的问题,但是如果你有这样的问题,你怎么合并它呢?var servers={{“ServerName”:“PC1”,“OS”:“Windows”},{“ServerName”:“PC1”,“location”:“Amsterdam”},{“ComputerName”:“PC3”,“OS”:“Windows”}var computers={{“ComputerName”:“PC1”,“location”:“Amsterdam”},{“ComputerName”:“PC2”,“location”:“London”},{“ComputerName”:“PC3”,“location”:“Berlin”}}我编辑了答案。但是请注意,您不能有像
{{a:1},{a:2}}
这样的对象,因为它是无效的。您需要有键或像
[{a:1},{a:2}]
那样使用它,因为这个变量mergeject={computers:[]};因为现在是computer:Array而不是Array。(我希望我的解释是正确的??)嗨,我做错了什么,他只绘制了第一个条目,然后他将该信息传递给所有其他条目?因此代码不会检查每一行?也许我可以发布我正在使用的更实际的数据,因为我需要通过更多的选项,而不仅仅是操作系统选项?再次编辑答案:)你是如何从windows中使用Windows2008的?因为键不同,什么是连接逻辑。有不同类型的连接。(内部、左侧、右侧、完整)这是错误的我编辑了我的文章。我编辑了我的post@kleineties.这是一个重大的变化。但我已经更新了我的答案,以符合你的新的细节
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"}
};