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)
在这里,我们创建一个位置查找表,然后根据查找表对原始解决方案进行排序.