我有一个像这样的对象数组:
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);
,但它并没有给我我想要的东西。
答案 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]; })
这里我们创建一个位置查找表,然后根据查找表对原始解决方案进行排序。