javascript中JSON对象的求和值

javascript中JSON对象的求和值,javascript,json,grouping,Javascript,Json,Grouping,我有一个API,它返回如下数据: { "attributes": { "type": "Opportunity" }, "Amount": 175.36, "Owner": { "attributes": { "type": "User" }, "Name": "Steve Knight"

我有一个API,它返回如下数据:

{
        "attributes": {
            "type": "Opportunity"
        },
        "Amount": 175.36,
        "Owner": {
            "attributes": {
                "type": "User"
            },
            "Name": "Steve Knight"
        }
    },

    {
        "attributes": {
            "type": "Opportunity"
        },
        "Amount": 6800,
        "Owner": {
            "attributes": {
                "type": "User"
            },
            "Name": "Bob Smith"
        }
    }
etc...
这些代表机会,因此每个销售人员都有多个机会。我试图返回一个对象,该对象对每个销售人员的金额进行求和,并返回如下内容:

{Steve Knight: 5590, Bob Smith: 98722, John Jones: 12347893}
我曾尝试按所有者名称对对象进行分组,但我不确定如何将金额相加

var groupBy = require('lodash.groupby');

var grouped = groupBy(data, function(x) {
        return x.Owner.Name;
      });

您可以在下面尝试:

let output = {}
data.map(function (item) {
    if (output.hasOwnProperty(item.Owner.Name)) {
            output[item.Owner.Name] = item.Amount;
    } else {
            output[item.Owner.Name] += item.Amount;
    }
 });

您可以在下面尝试:

let output = {}
data.map(function (item) {
    if (output.hasOwnProperty(item.Owner.Name)) {
            output[item.Owner.Name] = item.Amount;
    } else {
            output[item.Owner.Name] += item.Amount;
    }
 });
最好使用Array.prototype方法

控制台。清除; 作用{ 严格使用; 函数reducecoll、elem、idx、arr{ coll[elem.Owner.Name]=coll[elem.Owner.Name]| | 0; coll[elem.Owner.Name]+=elem.Amount 返回coll; } 常数数据=[ { 属性:{ 类型:机遇 }, 金额:175.36, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:100.16, 所有者:{ 属性:{ 类型:用户 }, 姓名:无名氏 } }, { 属性:{ 类型:机遇 }, 金额:6.00, 所有者:{ 属性:{ 类型:用户 }, 姓名:无名氏 } }, { 属性:{ 类型:机遇 }, 金额:101.65, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:6800, 所有者:{ 属性:{ 类型:用户 }, 姓名:鲍勃·史密斯 } } ]; const reducedata=data.reducereduce,{} console.logreducedata }; 最好使用Array.prototype方法

控制台。清除; 作用{ 严格使用; 函数reducecoll、elem、idx、arr{ coll[elem.Owner.Name]=coll[elem.Owner.Name]| | 0; coll[elem.Owner.Name]+=elem.Amount 返回coll; } 常数数据=[ { 属性:{ 类型:机遇 }, 金额:175.36, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:100.16, 所有者:{ 属性:{ 类型:用户 }, 姓名:无名氏 } }, { 属性:{ 类型:机遇 }, 金额:6.00, 所有者:{ 属性:{ 类型:用户 }, 姓名:无名氏 } }, { 属性:{ 类型:机遇 }, 金额:101.65, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:6800, 所有者:{ 属性:{ 类型:用户 }, 姓名:鲍勃·史密斯 } } ]; const reducedata=data.reducereduce,{} console.logreducedata
}; 如果键名存在,则将现有值累加到新值,否则只需添加初始值和名称

常数arr=[{ 属性:{ 类型:机遇 }, 金额:175.36, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:100, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:6800, 所有者:{ 属性:{ 类型:用户 }, 姓名:鲍勃·史密斯 } } ] const result=arr.reduceac,x=>{ const key=x.Owner.Name; 常量金额=x[“金额”]; 如果!acc[键]{ acc[键]=金额; }否则{ acc[键]=acc[键]+金额; } 返回acc; }, {};
如果key name存在,则将已有值累加到新值中,否则只需添加初始值和名称

常数arr=[{ 属性:{ 类型:机遇 }, 金额:175.36, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:100, 所有者:{ 属性:{ 类型:用户 }, 姓名:史蒂夫·奈特 } }, { 属性:{ 类型:机遇 }, 金额:6800, 所有者:{ 属性:{ 类型:用户 }, 姓名:鲍勃·史密斯 } } ] const result=arr.reduceac,x=>{ const key=x.Owner.Name; 常量金额=x[“金额”]; 如果!acc[键]{ acc[键]=金额; }否则{ acc[键]=acc[键]+金额; } 返回acc; }, {};
console.logresult看看这个:看看这个:你为什么写acc={…acc[key]:amount}而不是简单的acc[key]=amount?@rplantiko你是对的,只是因为变异了
ate有时,它对性能没有任何影响,垃圾收集器的工作也很好。你是说state你为什么写acc={…acc[key]:amount}而不是简单的acc[key]=amount?@rplantiko你是对的,只是因为有时会改变sate而使用它,不管怎样,它都不会影响性能,垃圾回收器的工作做得很好