首页 > 解决方案 > 如何合并两个具有相同键且具有相同值的对象数组,并且不同的值将存储在一个数组中?

问题描述

我从数据库中得到这样的数据:

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

标签: sqlnode.js

解决方案


您只需要编写一个程序即可。这就是我的处理方式:

// 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在访问数据时检查它是否是一个更干净的方法。


推荐阅读