【问题标题】:Group arrays in my object on a specific value - Javascript根据特定值对我的对象中的数组进行分组 - Javascript
【发布时间】:2021-07-08 18:02:03
【问题描述】:

我正在尝试根据特定值对对象中的数组进行分组。即使在网上看到文档并在 Stackoverflow 上研究了类似的问题后,我也找不到我的问题的答案。

例如我有这个对象:

const myList = [
{
  name: "task 1",
  mission: {
   id: 1,
   name: "mission #1",
   ...
  }
},
{
  name: "task 1",
  mission: {
   id: 3,
   name: "mission #2",
   ...
  }
},
{
  name: "task 2",
  mission: {
   id: 6,
   name: "mission #4",
   ...
  }
},
{
  name: "task 2",
  mission: {
   id: 19,
   name: "mission #3",
   ...
  }
}, 
...]

js 中按名称对我的对象进行分组并将此对象转换为的最佳方法是:

const myNewList = [
{
  name: "task 1",
  mission1: {
   id: 1,
   name: "mission #1",
   ...
  },
  mission2: {
   id: 2,
   name: "mission #2",
   ...
  }
},
{
  name: "task 2",
  mission3: {
   id: 3,
   name: "mission #3",
   ...
  }, 
  mission4: {
   id: 4,
   name: "mission #4",
   ...
  }
}, 
...]

提前感谢您的帮助。

【问题讨论】:

  • 您确定要在结果中为mission 提供唯一名称吗?与missions: [ {id:3, name:...}, {id:4,name:...}] 这样的数组相比,这对代码不太友好。然后每个组都有相同的“任务”属性
  • 您好,这只是一个简单的例子。实际上我在这样的对象中使用它:{ description: "", Admin: { //multiple value }, Reader: { //multiple value }, Editor: { //multiple value } }
  • 那么“多值”会是什么样子?仍然可能需要数组而不是对象。递增mission_1 -> mission_x 似乎不实用
  • 试试 lodash.groupBy

标签: javascript node.js arrays reactjs object


【解决方案1】:
const myNewList = myList.reduce((res, item) => {
  const group = res.find(i => i.name === item.name);
  if (!group)
    res.push({name: item.name, mission1: item.mission});
  else {
    const attrName = `mission${Object.keys(group).length}`;
    group[attrName] = item.mission;
  }
  return res;
}, []);

【讨论】:

  • 感谢您的解决方案。然而,密钥mission 只是一个例子。我的钥匙是Adminstrator : { id: 1, action: "all" } / Reader : { id: 2, action: "read" } / Editor { id: 3, name: "edit" }
  • 答案完全符合您提供的结构。请发布更详细的输入和输出数组示例,以帮助我们了解您的挑战
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 2023-02-05
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多