sql - 如何合并两个具有相同键且具有相同值的对象数组,并且不同的值将存储在一个数组中?
问题描述
我从数据库中得到这样的数据:
[
{
id_user:1,
expense:3000
},
{
id_user:1,
expense:5000
},
{
id_user:2,
expense:35000
},
{
id_user:3,
expense:50100
}
]
我怎样才能像这样转换为json?
[
{
id_user:1,
expense:[3000,5000]
},
{
id_user:2,
expense:35000
},
{
id_user:3,
expense:50100
}
]
解决方案
您只需要编写一个程序即可。这就是我的处理方式:
// phase 1
const combined = {};
for (const item of data) {
if (!combined[item.id_user]) {
combined[item.id_user] = [];
}
combined[item.id_user].push(item.expense);
}
// phase 2
const newData = [];
for (const id of Object.keys(combined)) {
newData.push({id_user: id, expense: combined[id]});
}
该方法是2个阶段。第一阶段遍历数据并将expense
同一用户的值组合到一个数组中。我将它构建成一个对象,因为以这种方式通过它们的键查找条目是有效的。如果有很多记录要处理,这将比推入Array
并使用.includes
来查找已经存在的条目更快。
第二阶段是使用组合阵列构建新expense
阵列。这是通过将每个新对象推入输出来完成的Array
。
expense
请注意,即使只有一项费用,我也选择让 new始终是一个数组。让属性具有一致的类型而不是Array
在访问数据时检查它是否是一个更干净的方法。
推荐阅读
- javascript - 如果条件在使用临时数据的脚本中不起作用
- jquery - 如何使用 jQuery 禁用表单下拉菜单?
- azure-devops - 在 DevOps 中将剩余工作分配给产品待办事项
- postgresql - PostgreSQL - GROUP BY 子句中存在的非聚合字段 - 替代方法
- sql - 如何在 windows 窗体中的 datagrid 中显示 XML 列内容?
- reactjs - SpeedDialAction 与 react-router-dom 链接
- ios - 尝试使用 App Groups 和 UserDefaults 在 Apple Watch 和 iOS 应用程序之间同步数据
- c# - 基于Linq C#中的CheckListBox选定值动态选择特定Linq
- ios - 即使在谷歌地图上生成大量自定义标记后如何不减速
- amazon-web-services - 我应该如何在 AWS Lambda 中指定 getMetricData 的参数以获取 CloudWatch 的 CloudFront 指标