合并具有相同ID但对象值相加的对象 [英] Merge objects with the same id but sum values of the objects
问题描述
我想通过比较数组中的前一个对象和当前对象来减少对象数组,如果前一个对象的ID与当前对象不同,那么我将前一个对象写入结果列表并用当前对象覆盖它否则我将两个对象的值相加.最后,它应该是精简数组,没有重复.
我有这样的数据:
[{点击次数:210,公司:"A",_id:{CompanyID:5}},{点击次数:35,公司:"C",_id:{CompanyID:3}},{点击次数:15公司:"B",_id:{CompanyID:2}},{点击次数:13公司:"A",_id:{CompanyID:5}}]
并希望将其简化为这种形式:
[{点击次数:223,公司:"A",_id:{CompanyID:5}},{点击次数:35,公司:"C",_id:{CompanyID:3}},{点击次数:15公司:"B",_id:{CompanyID:2}}]
到目前为止,这是我目前无法正常使用的解决方案:
$ scope.reduce = function(){var result = [];var prev = null;angular.forEach($ scope.data,函数(值,键){如果(上一个!= null){如果(prev._id.CompanyID!= value._id.CompanyID){result.push(prev);prev =值;} 别的 {prev.Clicks + = value.Clicks;}} 别的 {prev =值;}});}
我的结果看起来不错,它减少了所有重复项,但不求和具有相同ID的对象的值,只是覆盖了最后一个对象的ID.
您可以在 forEach
循环中使用 thisArg
参数,并传递一个空对象来存储值.>
var data = [{"Clicks":210,"Company":"A","_ id":{"CompanyID":5}},{点击数":35,公司":"C","_ id":{公司ID":3}},{点击数":15,公司":"B","_ id":{"CompanyID":2}},{点击次数":13,"Company":"A","_ id":{"CompanyID":5}}]];var result = [];data.forEach(function(obj){var id = obj._id.CompanyIDif(!this [id])result.push(this [id] = obj);否则this [id] .Clicks + = obj.Clicks;},Object.create(null));console.log(result);
I want to reduce my array of objects by comparing previous and current object from the array, if the id of previous object is different then current object, then I write the previous object to my result list and override it with the current object else I sum the values of both objects. In the end it should be a reduced array, no duplicates.
I have data like this:
[{
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 }
}]
And want to reduce it to this form:
[{
Clicks: 223,
Company: "A",
_id: { CompanyID: 5 }
},
{
Clicks: 35,
Company: "C",
_id: { CompanyID: 3 }
},
{
Clicks: 15,
Company: "B",
_id: { CompanyID: 2 }
}]
Here is my not correctly working solution so far:
$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;
}
});
}
My result looks good, it reduce all duplicates but it does not sum the values of objects with the same ids, it just overrides the ids with the last object.
You can use thisArg
parameter in forEach
loop and pass a empty object to store values.
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);
这篇关于合并具有相同ID但对象值相加的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!