Javascript 对象的唯一数组,并使用lodash或下划线合并重复项

Javascript 对象的唯一数组,并使用lodash或下划线合并重复项,javascript,arrays,underscore.js,lodash,Javascript,Arrays,Underscore.js,Lodash,我有一个可以包含重复项的对象数组,但我希望通过属性对数组进行uniquify,然后我希望有条件地合并重复项的属性。例如,给出下面的数组 var array = [ { name: 'object1', propertyA: true, propertyB: false, propertyC: false }, { name: 'object2', propertyA: false, propertyB: t

我有一个可以包含重复项的对象数组,但我希望通过属性对数组进行uniquify,然后我希望有条件地合并重复项的属性。例如,给出下面的数组

var array = [
   {
     name: 'object1',
     propertyA: true,
     propertyB: false,
     propertyC: false 
   },
   {
     name: 'object2',
     propertyA: false,
     propertyB: true,
     propertyC: false
   },
   {
     name: 'object1',
     propertyA: false,
     propertyB: true,
     propertyC: false
   }
]
知道每个对象都有name、propertyA、propertyB和propertyC,我想用name属性进行uniquify,并保留propertyA、propertyB和propertyC的真实值。所以上面的数组变成

var updatedArray = [
   {
     name: 'object1',
     propertyA: true,
     propertyB: true,
     propertyC: false 
   },
   {
     name: 'object2',
     propertyA: false,
     propertyB: true,
     propertyC: false
   }
]

使用lodash/下划线的最佳方法是什么?

对于纯Javascript,您可以使用哈希表作为对具有相同名称的唯一对象的引用,并在键上的循环中收集值,然后使用逻辑OR更新

var数组=[{name:'object1',propertyA:true,propertyB:false,propertyC:false},{name:'object2',propertyA:false,propertyB:true,propertyC:false},{name:'object1',propertyA:false,propertyB:true,propertyC:false},
unique=array.reduce(函数(散列){
返回函数(r,a){
如果(!hash[a.name]){
hash[a.name]={name:a.name};
r、 push(hash[a.name]);
}
Object.keys(a).forEach(函数(k){
如果(k!=“name”){
hash[a.name][k]=hash[a.name][k]| | a[k];
}
});
返回r;
};
}(Object.create(null)),[]);
console.log(唯一)
.as-console-wrapper{max-height:100%!important;top:0;}
您可以使用执行此操作,但这需要您在返回布尔值(它们是否相等)之前对其中一个参数进行变异,因此我不推荐使用它

更好的选择是使用后跟,以便对唯一名称进行分组,然后自定义如何组合它们。在本例中,您可以使用组合相同的命名对象,然后使用逻辑or
|
操作作为组合函数

有了ES6,它几乎变成了一条直线:

var数组=[{“name”:“object1”,“propertyA”:true,“propertyB”:false,“propertyC”:false},{“name”:“object2”,“propertyA”:false,“propertyB”:true,“propertyC”:false},{“name”:“object1”,“propertyA”:false,“propertyB”:true,“propertyC”:false};
var更新阵列=
_(数组)
.groupBy('名称')
.map(objs=>124;.assignWith({},…objs,(val1,val2)=>val1 | | val2))
.value();
console.log(updateArray)
。作为控制台包装{最大高度:100%!重要;顶部:0;}
顺便提一下,(这是此类问题的常见模式)。