Javascript 如何使用lodash总结基于某个键的收藏
我有以下Json数据,我想合并具有相同客户id的记录,所以每个客户id只有一条记录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
[
{
"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();出现以下错误:无法调用其类型缺少调用签名的表达式。类型“{}[]”没有兼容的调用签名。