按id typescript对对象数组进行分组[重复]

Posted

技术标签:

【中文标题】按id typescript对对象数组进行分组[重复]【英文标题】:Group array of objects by id typescript [duplicate] 【发布时间】:2021-10-05 02:21:59 【问题描述】:

我有这个对象数组

[
   id: '1', foo: 'bar' ,
   id: '1', foo: 'foo' ,
   id: '4', bar: 'foo' 
]

我如何将它通过id 合并得到下面的结果?

想要的结果:


  '1': [
     foo: 'bar' ,
     foo: 'foo' 
  ]
  '4': [
     bar: 'foo' 
  ]

我尝试过 Object.entries,但这种方法不适用于我正在做的事情。

编辑

我阅读了this 问题的答案,首先他们都没有完全回答我的问题,其次他们也不是打字稿答案。

所有答案都是 key => val 而我需要 key => 该键的对象数组

【问题讨论】:

你没有合并。你在分组。按 id 搜索 javascript ... OP 是如何尝试的?这是一个经典的reduce 任务。 我相信是Most efficient method to groupby on an array of objects 的副本。 那么那个问题的first answer 提供了一个完美返回您想要的结果的函数。只需使用groupBy(yourArray, 'id') 请不要破坏您的帖子。通过在 Stack Exchange 网络上发布,您已根据 CC BY-SA 4.0 许可授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本,因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work? 【参考方案1】:

您可以简单地使用Array.reduce 并相应地对它们进行分组。

const data = [
   id: '1', foo: 'bar' ,
   id: '1', foo: 'foo' ,
   id: '4', bar: 'foo' 
]

const formatData = data => data.reduce((acc, id, ...rest) => 
  acc[id] ??= [];
  acc[id].push(rest);
  return acc;
, );

console.log(formatData(data));
.as-console-wrapper 
  max-height: 100% !important;

【讨论】:

请检查this playground一次。【参考方案2】:

这是一个经典的reduce任务...

function groupItemRestById(collector, item) 
  const  id, ...rest  = item;
  const groupList = collector[id] || (collector[id] = []);

  groupList.push(rest);

  return collector;


console.log([

   id: '1', foo: 'bar' ,
   id: '1', foo: 'foo' ,
   id: '4', bar: 'foo' ,
  
].reduce(groupItemRestById, ));
.as-console-wrapper  min-height: 100%!important; top: 0; 

【讨论】:

@henroper ...我不知道...但是在查看 TS-Spec 之后可能类似于 ...declare function groupItemRestById(collector: any, item: any): any; ...可能已经成功了。

以上是关于按id typescript对对象数组进行分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按不同的 id 对项目数组进行分组

按对象 ID 对字典 NSFetchRequest 进行分组

按数组中的多个属性对对象进行分组,然后将它们的值相加

TypeScript数组按数组编号排序

是否可以对这种数组进行分组? [Javascript]

如何按月对数组中的值进行分组?