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

use*_*546 6 javascript arrays underscore.js angularjs-directive

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

array1 = [
  {field: 'username', display: 'username', hide: true},
  {field: 'age', display: 'Age', hide: true},
  {field: 'height', display: 'Height', hide: true}
]
Run Code Online (Sandbox Code Playgroud)

然后我有array2:

array2 = [
  {field: 'username', display: 'username 123', hide: false},
  {field: 'age', hide: false}
]
Run Code Online (Sandbox Code Playgroud)

我想通过它们的字段合并这两个数组,即最终结果应该是:

array3 = [
  {field: 'username', display: 'username 123', hide: false},
  {field: 'age', display: 'Age', hide: false},
  {field: 'height', display: 'Height', hide: true}
]
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*our 11

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

_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field')))
Run Code Online (Sandbox Code Playgroud)

我们使用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]; })
Run Code Online (Sandbox Code Playgroud)

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