【问题标题】:How do I group values present under a key in all objects in an array of JSON, under a single key?如何在单个键下对 JSON 数组中所有对象的键下存在的值进行分组?
【发布时间】:2020-05-19 12:19:10
【问题描述】:

我有一个 JSON 数组,例如:

[
   {user_id:1, name: "Person A", project: "Project A"},
   {user_id:1, name: "Person A", project: "Project B"},
   {user_id:2, name: "Person B", project: "Project A"},
   {user_id:2, name: "Person B", project: "Project C"},
   {user_id:3, name: "Person C", project: "Project D"}
]

我想转换这个数组,使一个人只有一个条目,并且它有一个值为 active_projects 的数组或他所有项目的值。基本上我想删除这个数组中的冗余。 输出将是:

[
   {user_id:1, name: "Person A", active_projects: ["Project A","Project B"] },
   {user_id:2, name: "Person B", active_projects: ["Project A","Project C"] },
   {user_id:3, name: "Person C", active_projects: ["Project D"] }
]

什么是最干净和最好的方法?

【问题讨论】:

  • 请添加您的尝试!
  • 前几天你不是问过同样的问题吗? stackoverflow.com/questions/61819398/…
  • @NinaScholz 实际上,我更改了数据检索模式以在单独的 SQL 查询中获取用户详细信息和项目,然后将它们合并到 O(n^2) 嵌套循环中。但这显然使我花费了额外的数据库查询和合并操作。如果我在单个查询中检索数据,它将如我的问题中所述。
  • @MoritzRoessler 如果您仔细查看 JSON 结构,这是一个不同的问题。

标签: javascript arrays json data-manipulation simplify


【解决方案1】:

一个简单的解决方案是首先使用 reduce 计算 user_ids 的映射。然后只需使用Object.values 将其变成一个数组。

const lkp = data.reduce((acc, {user_id, name, project}) => {
    acc[user_id] = acc[user_id] || {};
    acc[user_id].user_id = user_id;
    acc[user_id][name] = name;
    acc[user_id].active_projects = acc[user_id].active_projects || [];
    acc[user_id].active_projects.push(project);
    return acc;
}, {})

const arr = Object.values(lkp)

console.log(arr)
<script>
var data = [
   {user_id:1, name: "Person A", project: "Project A"},
   {user_id:1, name: "Person A", project: "Project B"},
   {user_id:2, name: "Person B", project: "Project A"},
   {user_id:2, name: "Person B", project: "Project C"},
   {user_id:3, name: "Person C", project: "Project D"}
];
</script>

【讨论】:

    【解决方案2】:

    你可以试试 JavaScript 的reduce 方法。

    var data =[ {user_id:1, name: "Person A", project: "Project A"}, {user_id:1, name: "Person A", project: "Project B"}, {user_id:2, name: "Person B", project: "Project A"}, {user_id:2, name: "Person B", project: "Project C"}, {user_id:3, name: "Person C", project: "Project D"}];
    
    result = Object.values(data.reduce((acc, {user_id, project, ...rest})=>{
      acc[user_id] =  acc[user_id] || { user_id, ...rest };
      acc[user_id].activeProject = acc[user_id].activeProject || [];
      acc[user_id].activeProject.push(project);
      return acc;
    },{}));
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2018-04-05
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多