2016-12-05 7 views
1

角度のついていないので、同じ名前のアイテムをマージすることをお勧めします。 anglejs内に同じ複数の項目がある場合のデータの統合方法

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

私は 名に等しいものであり、その量は、両方のオブジェクトをカウントする単一のオブジェクトに上記オブジェクトをマージします。 lodashなし

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); 
}) 

例:

$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()機能を提供することで、私たちを助ける:

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

ES中> = 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; 

幸運

関連する問題