Javascript 通过值合并对象在数组中保持唯一值

Javascript 通过值合并对象在数组中保持唯一值,javascript,arrays,object,Javascript,Arrays,Object,我一直在尝试做下面的事情。我很难想出一个干净的解决方案: obj1={ 关键词1:“ABC”, 键2:“123”, 键3:“唯一1” } obj2={ 关键词1:“ABC”, 键2:“123”, 键3:“唯一2” } //我一直在尝试合并这些,使其看起来像下面的输出 obj3={ 关键词1:“ABC”, 键2:“123”, 键3:[“唯一1”、“唯一2”] }您可以使用reduce功能并在obj1 var obj1={ 关键词1:“ABC”, 键2:“123”, 键3:“唯一1”, 键5:“

我一直在尝试做下面的事情。我很难想出一个干净的解决方案:

obj1={
关键词1:“ABC”,
键2:“123”,
键3:“唯一1”
}
obj2={
关键词1:“ABC”,
键2:“123”,
键3:“唯一2”
}
//我一直在尝试合并这些,使其看起来像下面的输出
obj3={
关键词1:“ABC”,
键2:“123”,
键3:[“唯一1”、“唯一2”]

}
您可以使用
reduce
功能并在
obj1

var obj1={
关键词1:“ABC”,
键2:“123”,
键3:“唯一1”,
键5:“4567”,
键7:“y”,
键8:“8y”,
键9:“yi89”,
key0:“DH64”,
键12:“DH64”,
键11:“DH64”
}
变量obj2={
关键词1:“ABC”,
键2:“123”,
键3:“唯一2”,
键4:“1212”,
键6:“a”,
键7:“z”,
键11:“z”
}
var result=Object.keys(obj1).reduce((a,k)=>{
a[k]=obj2[k]==undefined | | obj1[k]==obj2[k]?obj1[k]:[obj1[k],obj2[k];
返回a;
},{…obj1,…obj2});
控制台日志(结果)
。作为控制台包装器{
最大高度:100%!重要

}
您可以使用
mergeWith
方法并将空对象作为第一个参数传递以创建新对象。然后,您可以检查第一个属性的值是否等于第二个属性,并基于该创建数组

const obj1={
关键词1:“ABC”,
键2:“123”,
键3:“唯一1”
}
常数obj2={
关键词1:“ABC”,
键2:“123”,
键3:“唯一2”
}
const result=\与({},obj1,obj2,函数(a,b)合并{
如果(a==未定义)返回b
如果(a!=b)返回[]。concat(a,b)
})
console.log(结果)

您可以在
循环中使用
for…遍历对象的
,以检查值是否相等。请尝试以下操作:

var obj1={
关键词1:“ABC”,
键2:“123”,
键3:“唯一1”
}
变量obj2={
关键词1:“ABC”,
键2:“123”,
键3:“唯一2”
}
var res={};
用于(obj1中的var键){
如果(obj1[键]==obj2[键]){
res[key]=obj1[key];
}
否则{
变量温度=[];温度推送(obj1[键]);温度推送(obj2[键]);
res[键]=温度;
}
}

console.log(res)
用于该特定示例

res = {}

for(i in obj1){
  res[i] = (obj2[i] != obj1[i])? [obj1[i], obj2[i]] :  obj1[i]
}

该死,你用一个几乎完全相同的解决方案打败了我D@Reasonyeap:-)obj1中不存在的obj2中的键不会被合并,例如后续问题。如果我想对20多个对象执行此操作,我会使用for循环并检查每两个对象吗?谢谢你的帮助。@JamesMak是的。将此代码放入函数并循环这20个对象。在这种情况下:
key3:['UNIQUE1']
key3:[“UNIQUE2”]
您的解决方案有问题。@Ele更新了我的答案。现在它很完美!!
res = {}

for(i in obj1){
  res[i] = (obj2[i] != obj1[i])? [obj1[i], obj2[i]] :  obj1[i]
}