2017-05-09 52 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; }

相關問題