2017-06-02 4 views
0

でオブジェクトをマージオブジェクトを結果リストに追加し、それを現在のオブジェクトで上書きします。それ以外の場合は、両方のオブジェクトの値を合計します。最終的には、配列を減らして複製する必要はありません。私はその後、私は以前に書き、前のオブジェクトのIDが現在のオブジェクトと異なる場合、配列から以前と現在のオブジェクトを比較することによって、オブジェクトの私の配列を軽減するオブジェクトの同じIDが、合計値

私はこのようなデータを持っている:

[{ 
    Clicks: 210, 
    Company: "A", 
    _id: { CompanyID: 5 } 
}, 
{ 
    Clicks: 35, 
    Company: "C", 
    _id: { CompanyID: 3 } 
}, 
{ 
    Clicks: 15, 
    Company: "B", 
    _id: { CompanyID: 2 } 
}, 
{ 
    Clicks: 13, 
    Company: "A", 
    _id: { CompanyID: 5 } 
}] 

をそして、このフォームにそれを減らしたい:ここ

[{ 
    Clicks: 223, 
    Company: "A", 
    _id: { CompanyID: 5 } 
}, 
{ 
    Clicks: 35, 
    Company: "C", 
    _id: { CompanyID: 3 } 
}, 
{ 
    Clicks: 15, 
    Company: "B", 
    _id: { CompanyID: 2 } 
}] 

は、これまでのところ、私が正しく動作しないソリューションです。

$scope.reduce = function() { 
    var result = []; 
    var prev = null; 

    angular.forEach($scope.data, function (value, key) { 
     if (prev != null) { 
      if (prev._id.CompanyID != value._id.CompanyID) { 
       result.push(prev); 
       prev = value; 
      } else { 
       prev.Clicks += value.Clicks; 
      } 
     } else { 
      prev = value; 
     } 
    }); 
} 

私の結果はよく見える、それはすべての重複を減らすが、同じIDを持つオブジェクトの値を合計しない、それは単にtをオーバーライドする彼は最後のオブジェクトとids。

答えて

3

あなたはforEachループでthisArgパラメータを使用して保存値に空のオブジェクトを渡すことができます。 Array#reduceとバージョンについては

var data = [{"Clicks":210,"Company":"A","_id":{"CompanyID":5}},{"Clicks":35,"Company":"C","_id":{"CompanyID":3}},{"Clicks":15,"Company":"B","_id":{"CompanyID":2}},{"Clicks":13,"Company":"A","_id":{"CompanyID":5}}]; 
 
var result = []; 
 

 
data.forEach(function(obj) { 
 
    var id = obj._id.CompanyID 
 
    if(!this[id]) result.push(this[id] = obj); 
 
    else this[id].Clicks += obj.Clicks; 
 
}, Object.create(null)); 
 

 
console.log(result);

+0

あなたが助けてくれてありがとう。私は実際に私の間違いが何であるか知りたかった。私はすでに私が間違っていたことを発見しました。論理エラーがあります。なぜなら、深いコピーをする代わりに私の最初のオブジェクトを参照するからです。そして、あなたのコードは、キーワードthisを使用することによってやや刺激的です。私はそれがjavascriptで、特にここでこれを使うのは良いことではないと思う。 :) – Rep

+0

'私はそれがなぜjavascriptでこれを使うのは良くないと思う? –

+0

あなたの例では "これ"は刺激的ですが、それはうまく動作しますが、私のポイントからは良いデザインではありません。 「これ」が実際に何であるかははっきりしない。だから、私にとって、他の多くの開発者は、 "this"が混乱することがある(オブジェクトスコープやオブジェクトの関数スコープの "this")ことがあり、一貫性のない動作をもたらすことに同意するでしょう。ここでコードを変更した方法は次のとおりです。[link](https://jsfiddle.net/pt8e6op6/) – Rep

2

、あなたはハッシュテーブルの上に閉鎖と同じ会社への参照として、ハッシュテーブルを使用することができます。

var data = [{ Clicks: 210, Company: "A", _id: { CompanyID: 5 } }, { Clicks: 35, Company: "C", _id: { CompanyID: 3 } }, { Clicks: 15, Company: "B", _id: { CompanyID: 2 } }, { Clicks: 13, Company: "A", _id: { CompanyID: 5 } }], 
 
    result = data.reduce(function (hash) { 
 
     return function (r, a) { 
 
      var key = a._id.CompanyID; 
 
      if (!hash[key]) { 
 
       hash[key] = { Clicks: 0, Company: a.Company, _id: a._id }; 
 
       r.push(hash[key]); 
 
      } 
 
      hash[key].Clicks += a.Clicks; 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題