如何合并具有相同键且值相同但值不同的两个对象数组将存储在数组中?

时间:2020-01-26 09:30:55

标签: sql node.js

我是这样从数据库中获取数据的:

[
{
    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
}
]

2 个答案:

答案 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))