2017-05-31 111 views
0

對象的集合是否有javascipt的或Lodash方法的對象的此集合結合:結合基於多個屬性

[ 
{ 
    typeId: 'random1' 
    catId: 'random2' 
    val: '2' 
}, 
{ 
    typeId: 'random1' 
    catId: 'random2' 
    val: '3' 
}, 
{ 
    typeId: 'random1' 
    catId: 'random4' 
    val: '1' 
} 
] 

到這一個,與獨特TYPEID-CATID對和數值的每個對象值總結如下:

[ 
{ 
    typeId: 'random1' 
    catId: 'random2' 
    val: '5' 
}, 
{ 
    typeId: 'random1' 
    catId: 'random4' 
    val: '1' 
} 
] 
+0

那麼,你可能會使用'_.mergeWith(object,sources,customizer)',但這聽起來不像一個非常複雜的函數從頭開始寫。我懷疑這是自動的,特別是當這些數字是字符串時。 – Roope

+0

看起來有點過於具體,圖書館不能立即處理。 –

回答

1

首先創建一個對象,跟蹤類似對象的總值,然後將它們處理成最終輸出格式。事情是這樣的:

var data = [ 
 
{ 
 
    typeId: 'random1', 
 
    catId: 'random2', 
 
    val: '2' 
 
}, 
 
{ 
 
    typeId: 'random1', 
 
    catId: 'random2', 
 
    val: '3' 
 
}, 
 
{ 
 
    typeId: 'random1', 
 
    catId: 'random4', 
 
    val: '1' 
 
} 
 
]; 
 

 
var groups = data.reduce(function(acc, obj) { 
 
    acc[obj.typeId+'_'+obj.catId] = acc[obj.typeId+'_'+obj.catId] || 0; 
 
    acc[obj.typeId+'_'+obj.catId] += +obj.val; 
 
    return acc; 
 
}, {}); 
 

 

 
var result = Object.keys(groups).map(function(key) { 
 
    return { 
 
    typeId: key.split('_')[0], 
 
    catId: key.split('_')[1], 
 
    val : groups[key] 
 
    } 
 
}); 
 

 
console.log(result);

1

您可以通過typeIdcatId屬性使用forEach()環和thisArg參數去組對象。

var arr = [{"typeId":"random1","catId":"random2","val":"2"},{"typeId":"random1","catId":"random2","val":"3"},{"typeId":"random1","catId":"random4","val":"1"}] 
 

 
var result = []; 
 
arr.forEach(function(e) { 
 
    var key = e.typeId + '|' + e.catId 
 
    if(!this[key]) this[key] = e, result.push(this[key]) 
 
    else this[key].val = +this[key].val + +e.val 
 
}, {}); 
 

 
console.log(result)

0

這個怎麼樣?

for (var i=0; i<array.length; i++) { 
    for (var j=i+1; j<array.length; j++) { 
    if (array[i].typeId == array[j].typeId && array[i].catId == array[j].catId) { 
     array[i].val = parseInt(array[i].val) + parseInt(array[j].val); 
     array.splice(j--, 1); 
    } 
    } 
} 
+0

你不假設數組是排序的(在typeId第一個和catId上),如果不是這樣,你最終會得到多個對象,它們使用typeId和catId相同的組合 –

+0

你可以更詳細地解釋一下,或者給出我舉一個例子。 –

+1

嘗試與該陣列'變種陣列= [ { TYPEID: 'random1', CATID: 'random2', VAL: '2' }, { TYPEID: 'random2', CATID: 'random2' , VAL: '3' }, { TYPEID: 'random1', CATID: 'random2', VAL: '1' } ];'代替兩個對象的這將是3(第一和最後一項具有相同的ID) –

1

您可以使用query-js(*)。儘管如此,該模塊還沒有被維護。你會做財產以後這樣的:

arr.groupBy(function(e){return e.typeId + e.catId;}).each(function(grp){ 
    let first = grp.first(); 
    return { 
      typeId : first.typeId, 
      catId : first.catId, 
      val : grp.sum(function(e){return 0 + e.val;}) 
      }; 
}); 

它將第一組對象,然後做對每個組的計算

(*)請注意,我是完全偏見,你不能把我的字作爲建議,但只有建議,因爲我是查詢的創建者-js