2017-06-02 229 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; }

相关问题