2016-12-05 26 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; 

好运

相关问题