2017-06-02 132 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他與最後一個對象一起致敬。

回答

3

您可以在forEach循環中使用thisArg參數並傳遞一個空對象來存儲值。

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」可能會造成混淆(對象範圍或對象的功能範圍中的「this」)並導致不一致的行爲。這裏是我如何改變你的代碼:[link](https://jsfiddle.net/pt8e6op6/) – Rep

2

對於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 } }], 
 
    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; }

相關問題