javascript - 减少 - 分成多个批次
问题描述
我想弄清楚如何Batch
分组。例如res
应该返回两个 Batch ofF
和G
。
var data = {
Items: [{
ItemId: "222",
Sum: 2,
Batch: "F"
}, {
ItemId: "222",
Sum: 2,
Batch: "F"
}, {
ItemId: "333",
Sum: 3,
Batch: "G"
}, {
ItemId: "333",
Sum: 5,
Batch: "F"
}, ]
};
var res = data.Items.reduce((acc,obj)=>{
var existObj = acc.find(item=>item.Id === obj.ItemId);
if (existObj) {
existObj.Sum += obj.Sum;
return acc;
}
acc.push({
Id: obj.ItemId,
Sum: obj.Sum
});
return acc;
}
, []);
目前它的输出如下:
[
{
"Id": "222",
"Sum": 4
},
{
"Id": "333",
"Sum": 8
}
]
上面的逻辑,如果对象中存在 ItemId,则添加Sum
. 它结合了 ItemId 以消除重复。
它应该拆分为批次并基于Batch
. 例如预期的输出是这样的:
{
"Batch": [
{
"BatchName": "F",
"Lines": [
{
"Id": "222",
"Sum": 4
},
{
"Id": "333",
"Sum": 5
}
]
},
{
"BatchName": "G",
"Lines": [
{
"Id": "333",
"Sum": 3
}
]
}
]
}
注意:结构不必相同
解决方案
以下应该可以为您提供所需的东西
var tmp = data.Items.reduce((a,{ItemId, Sum, Batch})=>{
a[Batch] = a[Batch] || {}
a[Batch][ItemId] = a[Batch][ItemId] || {ItemId, Sum:0}
a[Batch][ItemId].Sum += Sum
return a;
},{});
var res = Object.keys(tmp)
.reduce((a,k)=> a.concat({BatchName: k, Lines: Object.values(tmp[k])}),[])
console.log(res)
<script>
var data = {
Items: [{
ItemId: "222",
Sum: 2,
Batch: "F"
}, {
ItemId: "222",
Sum: 2,
Batch: "F"
}, {
ItemId: "333",
Sum: 3,
Batch: "G"
}, {
ItemId: "333",
Sum: 5,
Batch: "F"
}, ]
};
</script>
推荐阅读
- matlab - MATLAB中超参数优化中的耦合变量
- c++ - 我在这段代码中要求一个数字,如果用户给了一个字母,我该怎么办?
- amazon-web-services - 如何获取防火墙的 S3 存储桶的完整 URL?
- node.js - 如何使用带有以下数据的mongodb聚合
- python - 按索引连接 n 个数据帧
- ajax - 如何将 Ajax 参数传递给 ASP.NET Core 中的控制器
- css - flexbox容器两个div响应
- javascript - 访问 Google Apps 脚本中已解析的嵌套 JSON 中的对象
- json - pyspark.sql 转 JSON
- google-cloud-platform - REST API 和 Google Cloud Endpoints 之间的关系?