合并两个JavaScript对象和冲突属性

合并两个JavaScript对象和冲突属性,javascript,node.js,merge,javascript-objects,Javascript,Node.js,Merge,Javascript Objects,假设我有两个对象: var obj1={汽车:'ford',水果:'peach',其他:['bar']} var obj2={cars:'ferari',info:'foo',other:['baz']} 现在我想合并这两个对象和任何冲突的属性。预期结果: {汽车:['ford','ferari',水果:'peach',信息:'foo',其他:['bar','baz']} 但是,使用对象扩展 {…obj1,…obj2} 返回 {汽车:“法拉利”,水果:“桃子”,信息:“福”,其他:['ba

假设我有两个对象:

var obj1={汽车:'ford',水果:'peach',其他:['bar']}
var obj2={cars:'ferari',info:'foo',other:['baz']}
现在我想合并这两个对象和任何冲突的属性。预期结果:

{汽车:['ford','ferari',水果:'peach',信息:'foo',其他:['bar','baz']}
但是,使用对象扩展

{…obj1,…obj2}
返回

{汽车:“法拉利”,水果:“桃子”,信息:“福”,其他:['baz']}
有没有办法合并这两个对象并将冲突的属性合并到数组中,而不是覆盖它们?

注意:我需要纯JS

您可以按属性合并,并检查目标是否不是数组,或者thje值是否是数组

const
合并=(目标,源)=>Object.entries(源).reduce((o[k,v])=>{
if(k in o){
如果(!Array.isArray(o[k])o[k]=[o[k]];
[].concat(v).forEach(项目=>{
如果(!o[k].包括(项))o[k].推送(项);
});
}否则{
o[k]=v;
}
返回o;
},目标);
var obj1={cars:'ford',fruit:'peach',other:['bar']},
obj2={汽车:“法拉利”,信息:“福”,其他:['baz']},
结果=[obj1,obj2].reduce(merge,{});

控制台日志(结果)您可以按属性合并,并检查目标是否不是数组或thje值是否是数组

const
合并=(目标,源)=>Object.entries(源).reduce((o[k,v])=>{
if(k in o){
如果(!Array.isArray(o[k])o[k]=[o[k]];
[].concat(v).forEach(项目=>{
如果(!o[k].包括(项))o[k].推送(项);
});
}否则{
o[k]=v;
}
返回o;
},目标);
var obj1={cars:'ford',fruit:'peach',other:['bar']},
obj2={汽车:“法拉利”,信息:“福”,其他:['baz']},
结果=[obj1,obj2].reduce(merge,{});

控制台日志(结果)您只需手动编写代码,没有自动方式进行这种类型的合并。而且,由于您希望合并数组的方式,需要一些特殊条件:

var obj1={汽车:'ford',水果:'peach',其他:['bar']}
var obj2={cars:'ferari',info:'foo',other:['baz']}
函数合并(obj1、obj2){
让result=Object.assign({},obj1);
for(让Object.entries(obj2))的[key,value]{
if(result.hasOwnProperty(key)){
如果(!Array.isArray(结果[key])){
//目标还不是数组,必须将其转换为数组
结果[键]=[结果[键];
}
//现在复制单个条目或条目数组
if(Array.isArray(obj2[key])){
//将所有数组项复制到另一个数组
结果[key].push(…obj2[key]);
}否则{
//将单个条目复制到另一个数组
结果[key]。推送(obj2[key]);
}
}否则{
//结果还没有此属性,只需将值复制到
结果[键]=值;
}
}
返回结果;
}

console.log(合并(obj1,obj2))您只需手动编写代码,没有自动方式进行这种类型的合并。而且,由于您希望合并数组的方式,需要一些特殊条件:

var obj1={汽车:'ford',水果:'peach',其他:['bar']}
var obj2={cars:'ferari',info:'foo',other:['baz']}
函数合并(obj1、obj2){
让result=Object.assign({},obj1);
for(让Object.entries(obj2))的[key,value]{
if(result.hasOwnProperty(key)){
如果(!Array.isArray(结果[key])){
//目标还不是数组,必须将其转换为数组
结果[键]=[结果[键];
}
//现在复制单个条目或条目数组
if(Array.isArray(obj2[key])){
//将所有数组项复制到另一个数组
结果[key].push(…obj2[key]);
}否则{
//将单个条目复制到另一个数组
结果[key]。推送(obj2[key]);
}
}否则{
//结果还没有此属性,只需将值复制到
结果[键]=值;
}
}
返回结果;
}

console.log(合并(obj1,obj2))这个应该也可以:

function mergeObject(o1, o2) {
  return {
    ...o2,
    ...Object.keys(o1).reduce((r, c) => ({
      ...r, [c]: o2.hasOwnProperty(c) ? [
        ...(Array.isArray(o1[c]) ? o1[c] : [o1[c]]),
        ...(Array.isArray(o2[c]) ? o2[c] : [o2[c]]),
      ] : o1[c]
    }), {})
  }
}

var obj1 = { cars: 'ford', fruit: 'peach', other: ['bar'] }
var obj2 = { cars: 'ferrari', info: 'foo', other: ['baz'] }
const result = mergeObject(obj1, obj2)
console.log(result)

这一条也应该有效:

function mergeObject(o1, o2) {
  return {
    ...o2,
    ...Object.keys(o1).reduce((r, c) => ({
      ...r, [c]: o2.hasOwnProperty(c) ? [
        ...(Array.isArray(o1[c]) ? o1[c] : [o1[c]]),
        ...(Array.isArray(o2[c]) ? o2[c] : [o2[c]]),
      ] : o1[c]
    }), {})
  }
}

var obj1 = { cars: 'ford', fruit: 'peach', other: ['bar'] }
var obj2 = { cars: 'ferrari', info: 'foo', other: ['baz'] }
const result = mergeObject(obj1, obj2)
console.log(result)
这是我的版本:)

var obj1={汽车:'ford',水果:'peach',其他:['bar']}
var obj2={cars:'ferari',info:'foo',other:['baz']}
var合并=(acc,[k,v])=>{
if(附件中的k){
acc[k]=[acc[k].扁平().混凝土(v)
}否则{
acc[k]=v;
}
返回acc;
}
var res=Object.entries(obj1).reduce(merge,obj2);
这是我的版本:)

var obj1={汽车:'ford',水果:'peach',其他:['bar']}
var obj2={cars:'ferari',info:'foo',other:['baz']}
var合并=(acc,[k,v])=>{
if(附件中的k){
acc[k]=[acc[k].扁平().混凝土(v)
}否则{
acc[k]=v;
}
返回acc;
}
var res=Object.entries(obj1).reduce(merge,obj2);

您必须手动循环对象的项目并创建新的object@rzwnahmd你能提供一个函数来实现这一点吗?有一个答案显示了一种纯JavaScript的实现方法。Lodash库确实使代码更加简洁。@VLAZ抱歉,但我需要使用纯javascript来实现这一点……您描述的数据结构是一个多重映射,如果您想围绕主题进行更多搜索,则必须手动循环对象的项并创建新的object@rzwnahmd你能提供一个函数来实现这一点吗?有一个答案显示了一种纯JavaScript的实现方法。Lodash库确实使代码更加简洁。@VLAZ抱歉,但我需要使用pu来实现这一点