我想通过比较数组中的前一个和当前对象来减少我的对象数组,如果先前对象的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他与最后一个对象一起致敬。
感谢您帮助。我其实想知道我的错误是什么。我已经发现我做错了,我有逻辑错误,因为我参考了我的第一个对象,而不是做一个深层复制。而使用关键字this,你的代码有点让人恼火。我认为在javascript中使用它并不好,特别是在这里。 :) – Rep
'我认为这是不好的使用JavaScript'这是为什么? –
在你的例子中,“this”令人讨厌,但它工作正常,但从我的角度来看并不是一个好设计。目前尚不清楚“实际”是什么。因此,对于我和许多其他开发人员会同意“this”可能会造成混淆(对象范围或对象的功能范围中的“this”)并导致不一致的行为。这里是我如何改变你的代码:[link](https://jsfiddle.net/pt8e6op6/) – Rep