2017-05-09 54 views
0

我有一个对象数组可以包含重复项,但我希望通过属性唯一化数组,然后我想有条件地合并重复项的属性。例如,在下面独特的对象数组和合并重复使用lodash或下划线

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 
    } 
] 

数组知道每个对象名称,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 /下划线?

回答

1

你可以做它用_.uniqWith,但它需要你发生变异的参数之一返回它们是否相等的布尔值之前,所以我不建议这样做。

一个更好的选择是使用_.groupBy然后_.map为了分组唯一的名称,然后自定义如何组合它们。在你的情况下,你可以使用_.assignWith合并相同命名的对象,然后给逻辑或||作为组合函数。

随着ES6,它几乎成为一个班轮:

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}]; 
 
    
 
var updatedArray = 
 
    _(array) 
 
    .groupBy('name') 
 
    .map(objs => _.assignWith({}, ...objs, (val1, val2) => val1 || val2)) 
 
    .value(); 
 
    
 
console.log(updatedArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

顺便说一句,['_.groupBy'和'_.map',解决所有问题的雅( http://stackoverflow.com/a/38774930/5743988)(这是这种问题的常见模式)。 – 4castle

+0

作品完美!谢谢! – frostme

0

使用简单的Javascript,您可以使用散列表作为对具有相同名称的唯一对象的引用,并通过键在循环中收集值并使用逻辑OR进行更新。

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 }], 
 
    unique = array.reduce(function (hash) { 
 
     return function (r, a) { 
 
      if (!hash[a.name]) { 
 
       hash[a.name] = { name: a.name }; 
 
       r.push(hash[a.name]); 
 
      } 
 
      Object.keys(a).forEach(function (k) { 
 
       if (k !== 'name') { 
 
        hash[a.name][k] = hash[a.name][k] || a[k]; 
 
       } 
 
      }); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

相关问题