合并具有相同ID但对象值相加的对象 [英] Merge objects with the same id but sum values of the objects

查看:74
本文介绍了合并具有相同ID但对象值相加的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过比较数组中的前一个对象和当前对象来减少对象数组,如果前一个对象的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆