2016-12-05 25 views
1

我是新來的角,我想合併項目從數組中具有相同名稱 。如何合併數據,如果在angularjs中有相同的多個項目

$scope.items_list = [{name: 'cars',quantity: 2}, {name: 'cars', quantity: 4}, {name: 'cars', quantity: 5},{name: 'trucks',quantity: 2}, {name: 'trucks', quantity: 3}]; 

所以我要合併的上述目的成一個單獨的對象,其中 名稱是平等,並且該數量將被計數的兩個對象的。

so I want the output like 

$scope.items_list_merged = [{name:'cars', quantity: 11(example from above list: 2+4+5)},{name:'trucks', quantity: 5(example from above list: 2+3)}]; 

回答

0

例無lodash:

// Create temporary container for easy access by name 
var objs = {}; 
angular.forEach($scope.items_list, function(item) { 
    // Add new item/add to existing item's quantity 
    objs[item.name] = objs[item.name] || { name: item.name, quantity: 0 }; 
    objs[item.name].quantity = objs[item.name].quantity + item.quantity; 
}) 
// Push each value to an array 
$scope.items_list_merged = []; 
angular.forEach(objs, function(item) { 
    $scope.items_list_merged.push(item); 
}) 

例與lodash:

$scope.items_list_merged = _.reduce($scope.items_list, function(collector, item) { 
    var idx = _.findIndex(collector, {name: item.name}); 
    if (idx === -1) { collector.push(item) } 
    else { collector[idx].quantity = collector[idx].quantity + item.quantity } 
}, []) 
+0

太棒了。謝謝 – Kranthi

0

這有沒有關係角度,是純JavaScript,非常有趣了。在下文中,角將幫助我們只有通過提供其copy()功能:如果在ES

function aggregateByName(list) { 
    // map by name, aggregating quantities 
    var mappedList = list.reduce(function(aggregate, item) { 
     var existingItem = aggregate[item.name]; 
     if(!existingItem) { 
      // copy, so as not to modify the original object 
      aggregate[item.name] = angular.copy(item); 
     } 
     else { 
      existingItem.quantity += item.quantity; 
     } 
     return aggregate; 
    }, {}); 

    // convert to array of values 
    return Object.keys(mappedList).map(function(key) { 
     return mappedList[key]; 
    }); 
} 

> = 6:

function aggregateByName(list) { 
    var mappedList = list.reduce((aggregate, item) => { 
     var existingItem = aggregate[item.name]; 
     if(!existingItem) { 
      aggregate[item.name] = angular.copy(item); 
     } 
     else { 
      existingItem.quantity += item.quantity; 
     } 
     return aggregate; 
    }, {}); 

    return Object.keys(mappedList).map(key => mappedList[key]); 
} 

最後:

$scope.items_list_merged = aggregateByName($scope.items_list) 
0

庫loadash先添加項目,然後使用下面的代碼:

var array = []; 
    $scope.items_list = _.groupBy($scope.items_list, 'name'); 

    angular.forEach($scope.items_list , function(value , key){ 
     var count = 0; 
     angular.forEach(value , function(list){ 
      count = list.quantity + count; 
     }); 
     array.push({name:key , quantity:count}) 
    }); 
$scope.items_list = array; 

好運

相關問題