2017-03-07 67 views
1

我有两个对象:如何在JavaScript中连接两个对象与数组属性?

var one = { 
    addedItems: [0, 1], 
    removedItems: [8, 9], 
    oneTwo: false, 
    someStuff: { 
    anotherArray: ['a', 'b'] 
    } 
}; 

var two = { 
    addedItems: [3, 4], 
    removedItems: [6, 7], 
    someStuff: { 
    anotherArray: ['c', 'd'] 
    } 
}; 

而在最后,我需要合并这两个对象,并得到这样的:

{ 
    addedItems: [0, 1, 3, 4], 
    removedItems: [8, 9, 6, 7], 
    oneTwo: false, 
    someStuff: { 
    anotherArray: ['a', 'b', 'c', 'd'] 
    } 
} 

操作应该对不同结构的物体进行。

要做到这一点,最好的方法是什么? jQuery中是否有任何方法或下划线/ lodash允许这样做?

+0

为了澄清......如果两个对象有一个属性,它是一个数组,你要到2彼此融合...但是如果一个'会发生什么.foo:true'和'b.foo:false'当值是原子时哪个优先?同样,如果数组中的值包含重复项,那么您希望重复项还是唯一值? – scunliffe

+0

最后一个。例如,如果我们有doConcatenation(一,二),那么来自“two”的属性将是result属性。 – Vovch

+1

这个概念被称为深层合并,并有一个优秀的'deepmerge'库。 [这是一个关于它的博客(昨天发布)](https://davidwalsh.name/javascript-deep-merge) – lonesomeday

回答

1

您可以生成一个新对象,并使用已插入数组中的项目追加数组。

function deepMerge(source, target) { 
 
    Object.keys(source).forEach(function (k) { 
 
     if (Array.isArray(source[k])) { 
 
      if (!Array.isArray(target[k])) { 
 
       target[k] = []; 
 
      }   
 
      target[k] = target[k].concat(source[k]); 
 
      return; 
 
     } 
 
     if (source[k] && typeof source[k] === 'object') { 
 
      target[k] = target[k] || {}; 
 
      deepMerge(source[k], target[k]); 
 
      return; 
 
     } 
 
     target[k] = source[k]; 
 
    }); 
 
} 
 

 
var one = { addedItems: [0, 1], removedItems: [8, 9], oneTwo: false, someStuff: { anotherArray: ['a', 'b'] } }, 
 
    two = { addedItems: [3, 4], removedItems: [6, 7], someStuff: { anotherArray: ['c', 'd'] } }, 
 
    result = {}; 
 

 
deepMerge(one, result); 
 
deepMerge(two, result); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

4

你检查Lodash _.mergeWith(object, sources, customizer)方法?我认为这个例子就是你基本期待的。

https://lodash.com/docs/4.17.4#mergeWith

var one = { addedItems: [0, 1], removedItems: [8, 9], oneTwo: false, someStuff: { anotherArray: ['a', 'b'] } }, 
    two = { addedItems: [3, 4], removedItems: [6, 7], someStuff: { anotherArray: ['c', 'd'] } }; 

// In case of arrays, concatenate them instead 
function customizer(objValue, srcValue) { 
    if (_.isArray(objValue)) { 
    return objValue.concat(srcValue); 
    } 
} 

var result = _.mergeWith(one, two, customizer); 

Here's the working example in Fiddle

相关问题