卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章76330本站已运行4320

#LearnedToday:ObjectgroupBy()

#learnedtoday:objectgroupby()

?终于出来了!不再需要编写丑陋的代码来按字段的特定值对对象数组进行分组!

自 2023 年底以来,对象有一个名为 groupby() 的官方静态方法,可以为我们做到这一点!
它接受一个 iterable(例如数组)和一个函数,该函数针对每个元素执行,并且必须返回该特定元素的“类别”。
该方法返回一个新对象,其中每个键都是一个不同的类别,其中包含属于该特定类别的对象数组。

注意:返回的对象和原始可迭代对象中的元素是相同的(不是深拷贝!)。更改元素的内部结构将反映在原始可迭代对象和返回的对象中。

例子

让我们举一个实际的例子来看看按年龄对所有忍者神龟角色进行分组是多么容易

初始数组

const ninjaturtlescharacters = [
  { age: 16, name: 'michelangelo' },
  { age: 16, name: 'raffaello' },
  { age: 16, name: 'donatello' },
  { age: 16, name: 'leonardo' },
  { age: 91, name: 'splinter' },
  { age: 25, name: 'casey jones' },
  { age: 25, name: 'april o'neil' }
];

好的老方法(使用reduce)

const ninjaturtlescharactersbyage = ninjaturtlescharacters.reduce(
  (groupedpeople, item) => ({
    ...groupedpeople,
    [item.age]: groupedpeople[item.age]
      ? [...groupedpeople[item.age], item]
      : [item],
  }),
  {}
);

现代方式

const ninjaturtlescharactersbyagenew = object.groupby(
  ninjaturtlescharacters,
  ({ age }) => age
);

提示:如果您想返回 map 而不是 object,请使用 map.groupby()

结果

{
  "16": [
    { age: 16, name: 'Michelangelo' },
    { age: 16, name: 'Raffaello' },
    { age: 16, name: 'Donatello' },
    { age: 16, name: 'Leonardo' }
  ],
  "25": [
    { age: 25, name: 'Casey Jones' },
    { age: 25, name: 'April O'Neil' }
  ],
  "91": [
    { age: 91, name: 'Splinter' }
  ]
}

演示

??‍? 像往常一样,我创建了一个简单的 stackblitz 项目来使用代码。

? 文档:https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/object/groupby

ℹ 浏览器支持:https://caniuse.com/mdn-javascript_builtins_object_groupby

卓越飞翔博客
上一篇: 庆祝开源贡献:成长与协作之旅
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏