2014-12-18 49 views
6

我有对象的一个​​这样的数组:我如何可以合并对象的数组下划线JS

array1 = [ 
    {field: 'username', display: 'username', hide: true}, 
    {field: 'age', display: 'Age', hide: true}, 
    {field: 'height', display: 'Height', hide: true} 
] 

然后,我有数组2:

array2 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', hide: false} 
] 

我想通过这两个数组合并他们的场即最后的结果应该是:

array3 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', display: 'Age', hide: false}, 
    {field: 'height', display: 'Height', hide: true} 
] 

我试图var newObj = _.extend(array1, array2);但它并没有给我我想要的东西。

+0

您正在寻找concat。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat – Brian 2014-12-18 22:24:18

+0

@Brian:不,他正在做某种更新。 – 2014-12-18 22:25:27

+0

@Karoly Horvath是的,他想合并对象以及数组 – Brian 2014-12-18 22:26:47

回答

10

没有一个功能可以做到,因为它是一个相当专业化的操作。然而,它的下划线功能相当简单的构图:

_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))) 

我们使用indexBy打开阵列成键的field值对象,然后extend做我们想要的。最后,values将它变回一个数组。

注意的是,虽然这不作任何保证有关订单,在目前_和V8实现最终的阵列将是array1随后事情的东西从array2不在array1,在整理每个阵列的原始排序。

另请注意,_.extend函数对第一个参数具有破坏性,但这不会更改任何数组。

如果你想确保顺序是一样的原始array1

order = _.object(_.map(array1, function(obj, i) { return [obj.field, i]; })) 
_.sortBy(_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))), function(obj) { order[obj.field]; }) 

在这里,我们做位置的查找表,然后进行排序基于查找表最初的解决方案。

+0

谢谢,那正是我想要的。我如何保存订单。我的意思是我希望那个订单应该保持在第一个数组中。第二个数组不会有任何新的元素。其唯一更新 – user3214546 2014-12-18 22:32:43

+0

绝对优秀的答案! – 2016-10-10 15:29:11

+0

我有2个列表:[{“image_id”:631293,“score”:73},{“image_id”:11848407,“score”:56}]' 第二个是'[{ :631293,“article_id”:173},{“image_id”:11848407,“article_id”:121}' 如果我尝试应用您的方法,它不会更改任何内容 – Toucouleur 2016-11-21 16:59:13

相关问题