2017-12-28 18 views
-1

同じseq idを持つすべての数値を加算し、加算値を持つ数値をfinalと呼ばれる新しい配列にプッシュします。IDを比較して数値を加算して新しい配列にプッシュ

INPUT =>

$scope.initial = [{seq:11, name:'ABC', number:20}, 
        {seq:11, name:'ABC', number:50}, 
        {seq:11, name:'ABC', number:80}, 
        {seq:12, name:'DEF', number:30}, 
        {seq:13, name:'JKL', number:10}, 
        {seq:13, name:'JKL', number:15}]; 

OUTPUT =>

$scope.final = [{seq:11, name:'ABC', number:150}, 
       {seq:12, name:'DEF', number:30}, 
       {seq:13, name:'JKL', number:25}]; 

ありがとうございました!

+3

あなたの試みも共有してください。 – gurvinder372

+0

@ gurvinder372お願いしてくれてありがとう!私は質問を簡略化しました。私のコードデータセットは異なっています。 –

答えて

0
$scope.final = []; 
var acc = {}; 

for(const {seq, name, number} of $scope.initial){ 

    if(seq === acc.seq && name === acc.name){ 
    acc.number += number; 
    }else{ 
    $scope.final.push(acc = {seq, name, number}); 
    } 

} 

アキュムレータを使用して、現在の結果の要素を追跡してください。次に、現在の反復要素がそのアキュムレータと一致するかどうかをチェックします(現在の要素を新しいアキュムレータとして追加しない場合)。配列&チェックの

+2

「for of」ループを使用していることに注意してください。ブラウザで正しく動作させるために、Babelのようなトランスパイライザを使用する必要があるかもしれません。 –

+0

@Jonas W.それは最終的な配列に正しいを押しているが、追加は起こっていない。第1ループでは、 –

+0

@ RajuSahを追加せずに値がプッシュされています[What ??](http://jsbin.com/kawokuzehi/edit?console) –

0

ループその後、追加しない場合、それはseqを持っている場合は、この

var m = [{ 
 
    seq: 11, 
 
    name: 'ABC', 
 
    number: 20 
 
    }, 
 
    { 
 
    seq: 11, 
 
    name: 'ABC', 
 
    number: 50 
 
    }, 
 
    { 
 
    seq: 11, 
 
    name: 'ABC', 
 
    number: 80 
 
    }, 
 
    { 
 
    seq: 12, 
 
    name: 'DEF', 
 
    number: 30 
 
    }, 
 
    { 
 
    seq: 13, 
 
    name: 'JKL', 
 
    number: 10 
 
    }, 
 
    { 
 
    seq: 13, 
 
    name: 'JKL', 
 
    number: 15 
 
    } 
 
]; 
 
var grouped = []; 
 
m.forEach(function(a) { 
 
    if (!this[a.seq]) { 
 
    this[a.seq] = { 
 
     seq: a.seq, 
 
     name: a.name, 
 
     number: 0 
 
    }; 
 
    grouped.push(this[a.seq]); 
 
    } 
 
    this[a.seq].number = (+this[a.seq].number + +a.number); 
 
}, Object.create(null)); 
 

 
console.log(grouped);

0

次のようなタスクを達成するために減らす使用することができます。

$scope.initial = [ 
    {seq:11, name:'ABC', number:20}, 
    {seq:11, name:'ABC', number:50}, 
    {seq:11, name:'ABC', number:80}, 
    {seq:12, name:'DEF', number:30}, 
    {seq:13, name:'JKL', number:10}, 
    {seq:13, name:'JKL', number:15} 
]; 

var objReduced = arr.reduce(function(acc, cur){ 
    acc[cur.seq] ? acc[cur.seq].number += cur.number : acc[cur.seq] = cur; 
    return acc; 
}, {}); 

$scope.final = Object.keys(objReduced).map(function(x){ return objReduced[x]; }); 
関連する問題