Javascript 如何使用lodash总结基于某个键的收藏

Javascript 如何使用lodash总结基于某个键的收藏,javascript,lodash,Javascript,Lodash,我有以下Json数据,我想合并具有相同客户id的记录,所以每个客户id只有一条记录 [ { "id":2, "customer_id":2, "amount":50, "total":100, "currency_code":"USD", "customer":{ "id":2, "name":"ABC Company", "latest_comment":nu

我有以下Json数据,我想合并具有相同客户id的记录,所以每个客户id只有一条记录

  [
   {
      "id":2,
      "customer_id":2,
      "amount":50,
      "total":100,
      "currency_code":"USD",
      "customer":{
         "id":2,
         "name":"ABC Company",
         "latest_comment":null
      }
   },
   {
      "id":3,
      "customer_id":3,
      "amount":90,
      "total":60,
      "currency_code":"USD",
      "customer":{
         "id":3,
         "name":"ABC Company 1"
      }
   },
   {
      "id":7,
      "customer_id":3,
      "amount":10,
      "total":40,
      "currency_code":"USD",
      "customer":{
         "id":3,
         "name":"ABC Company 1"
      }
   }
 ]
在此示例中,有两个customer_id=3的对象(第二个和第三个)

我想按customer_id汇总行数,以便生成的集合如下所示

   [
       {
          "id":2,
          "customer_id":2,
          "amount":50,
          "total":100,
          "currency_code":"USD",
          "customer":{
             "id":2,
             "name":"ABC Company",
             "latest_comment":null
          }
       },
       {
          "id":null,             //just because there are multiple rows with same customer_id
          "customer_id":3,
          "amount":100,
          "total":100,
          "currency_code":"USD",
          "customer":{
             "id":3,
             "name":"ABC Company 1"
          }
       }
   ]

您可以使用以下代码获取总和:

var-arr=[{
“id”:2,
“客户id”:2,
“金额”:50,
“总数”:100,
“货币代码”:“美元”,
“客户”:{
“id”:2,
“名称”:“ABC公司”,
“最新注释”:空
}
},
{
“id”:3,
“客户id”:3,
“金额”:90,
“总数”:60,
“货币代码”:“美元”,
“客户”:{
“id”:3,
“名称”:“ABC公司1”
}
},
{
“id”:7,
“客户id”:3,
“金额”:10,
“总数”:40,
“货币代码”:“美元”,
“客户”:{
“id”:3,
“名称”:“ABC公司1”
}
}
]
无功输出=
_(arr)
.groupBy('customer_id'))
.map((对象,键)=>({
“客户id”:密钥,
‘金额’:uj.sumBy(objs,‘金额’),
“总计”:.sumBy(objs,“总计”)
}))
.value();
控制台日志(输出)

您可以使用以下代码获得总和:

var-arr=[{
“id”:2,
“客户id”:2,
“金额”:50,
“总数”:100,
“货币代码”:“美元”,
“客户”:{
“id”:2,
“名称”:“ABC公司”,
“最新注释”:空
}
},
{
“id”:3,
“客户id”:3,
“金额”:90,
“总数”:60,
“货币代码”:“美元”,
“客户”:{
“id”:3,
“名称”:“ABC公司1”
}
},
{
“id”:7,
“客户id”:3,
“金额”:10,
“总数”:40,
“货币代码”:“美元”,
“客户”:{
“id”:3,
“名称”:“ABC公司1”
}
}
]
无功输出=
_(arr)
.groupBy('customer_id'))
.map((对象,键)=>({
“客户id”:密钥,
‘金额’:uj.sumBy(objs,‘金额’),
“总计”:.sumBy(objs,“总计”)
}))
.value();
控制台日志(输出)
用于收集具有相同
客户id的对象,然后使用将每个组合并为单个对象

const data=[{“id”:2,“customer_id”:2,“amount”:50,“total”:100,“currency_code”:“USD”,“customer”:“id”:2,“name”:“ABC Company”,“latest_comment”:null},{“id”:3,“customer_id”:3,“amount”:90,“total”:60,“currency_code”:“USD”,“customer”:“id”:3,“name”:“ABC Company 1”},{“id”:7,“customer_id”:3,“amount”:10,“total”:40,“currency_code”:“USD”,“customer”:“USD”,“customer”:”{“id”:3,“名称”:“ABC公司1”}}];
var结果=(数据)
//按客户id对对象进行分组
.groupBy('customer_id'))
//合并每组
.map((g)=>uu.mergeWith({},…g,(o,s,k)=>{
//如果键为amount或total,则添加数字
如果((k=='amount'| | k=='total')&&&.isNumber(o)){
返回o+s;
}
//如果密钥为id,则如果有多个,则将其转换为null
如果(k=='id'&&&&&&.isNumber(o)&&&&&&.isNumber(s)){
返回null;
}
}))
.value();
console.log(结果);
用于收集具有相同
客户id的对象,然后使用将每个组合并为单个对象

const data=[{“id”:2,“customer_id”:2,“amount”:50,“total”:100,“currency_code:”USD“,”customer“:”2,“name:”ABC Company“,”latest_comment:”null}},{“id”:3,“customer_id”:3,“amount”:90,“total”:60,“currency_code:”USD“,”customer:”{“id”:3,“name:”ABC Company 1},{“id”:7,“customer_id”:3,“amount”:10,“total”:40,“currency(customer:”USD“,”customer“,”customer:”id“:3,“名称”:“ABC公司1”}}];
var结果=(数据)
//按客户id对对象进行分组
.groupBy('customer_id'))
//合并每组
.map((g)=>uu.mergeWith({},…g,(o,s,k)=>{
//如果键为amount或total,则添加数字
如果((k=='amount'| | k=='total')&&&.isNumber(o)){
返回o+s;
}
//如果密钥为id,则如果有多个,则将其转换为null
如果(k=='id'&&&&&&.isNumber(o)&&&&&&.isNumber(s)){
返回null;
}
}))
.value();
console.log(结果);

不鼓励只使用代码的答案。您可以通过添加对您所做工作的描述、您的代码与OP的区别以及解决方案的关键点来改进您的答案。这非常有效,但是在使用typescript时我遇到了一些问题。让arr:Array这样当我使用var-temp:Array=[];temp=u.groupBy(arr,'customer_id').value();出现以下错误:无法调用其类型缺少调用签名的表达式。类型“{}[]'没有兼容的呼叫签名。不鼓励只使用代码的答案。您可以通过添加对您所做工作的描述、您的代码与OP的区别以及解决方案的要点来改进您的答案。这非常有效,但是使用typescript时我遇到了一些问题让arr:Array这样当我像下面这样分组时p:Array=[];temp=..groupBy(arr,'customer_id').value();出现以下错误:无法调用其类型缺少调用签名的表达式。类型“{}[]”没有兼容的调用签名。