我是这样从数据库中获取数据的:
[
{
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
}
]
答案 0 :(得分:-1)
您只需要编写一个程序即可。这就是我的处理方式:
// 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]});
}
方法分为两个阶段。第一阶段遍历数据,并将同一用户的expense
值合并到一个数组中。我将其构建到一个对象中,因为这样可以有效地通过其键查找条目。如果要处理的记录很多,这比放入Array
并使用.includes
查找已经存在的条目要快。
第二阶段正在使用合并的expense
数组构建新数组。这是通过将每个新对象推入输出Array
来完成的。
请注意,即使只有一个开销,我还是选择使新的expense
始终为数组。拥有一个具有一致类型的属性比访问数据时不必检查它是否为Array
更干净。
答案 1 :(得分:-1)
Reduce&Map是必经之路。而且最好将所有费用字段都设为数组,这样就不必检查天气是否为数组
const sample = [{
id_user: 1, expense: 3000
}, {
id_user: 1, expense: 5000
}, {
id_user: 2, expense: 35000
}, {
id_user: 3, expense: 50100
}]
const parseData = data => {
return [...data.reduce((acc, { id_user, expense }) => {
const currentUser = acc.get(id_user)
const newExpense = currentUser ? currentUser.expense : []
newExpense.push(expense)
acc.set(id_user, { id_user, expense: newExpense })
return acc
}, new Map()).values()]
}
console.log(parseData(sample))