如何合并下划线js的对象数组

时间:2014-12-18 22:20:12

标签: javascript arrays angularjs-directive underscore.js

我有一个像这样的对象数组:

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

然后我有array2:

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);,但它并没有给我我想要的东西。

1 个答案:

答案 0 :(得分:11)

没有一个功能可以做到这一点,因为它是一个相当专业的操作。但是,它是一个相当简单的下划线函数组合:

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

我们使用indexBy将数组转换为field值上的对象,然后extend执行我们想要的操作。最后,values将其变回数组。

请注意,虽然这并没有对订单做出任何保证,但在当前的_和v8实现中,最终的数组将是来自array1的内容,后跟来自{{array2的内容1}}不在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]; })

这里我们创建一个位置查找表,然后根据查找表对原始解决方案进行排序。