Skip to content

groupBy

根据指定的键或函数对数组进行分组

分组依据

原始数据

[
  {
    "name": "Alice",
    "age": 25,
    "role": "admin",
    "city": "Beijing"
  },
  {
    "name": "Bob",
    "age": 30,
    "role": "user",
    "city": "Shanghai"
  },
  {
    "name": "Charlie",
    "age": 25,
    "role": "user",
    "city": "Beijing"
  },
  {
    "name": "David",
    "age": 35,
    "role": "admin",
    "city": "Shanghai"
  }
]

分组结果

{
  "admin": [
    {
      "name": "Alice",
      "age": 25,
      "role": "admin",
      "city": "Beijing"
    },
    {
      "name": "David",
      "age": 35,
      "role": "admin",
      "city": "Shanghai"
    }
  ],
  "user": [
    {
      "name": "Bob",
      "age": 30,
      "role": "user",
      "city": "Shanghai"
    },
    {
      "name": "Charlie",
      "age": 25,
      "role": "user",
      "city": "Beijing"
    }
  ]
}

函数签名

typescript
function groupBy<T>(
  array: T[],
  keyOrFn: keyof T | ((item: T) => string | number)
): Record<string, T[]>

参数

参数名类型必填说明
arrayT[]要分组的数组
keyOrFnkeyof T | ((item: T) => string | number)分组的键名或返回键的函数

返回值

类型说明
Record<string, T[]>分组后的对象,键为分组标识,值为该组的数组元素

工作原理

  1. 遍历输入数组的每个元素
  2. 根据提供的键名或函数计算分组键
  3. 将元素添加到对应的分组中
  4. 返回包含所有分组的对象

使用示例

按属性分组

typescript
const users = [
  { name: 'Alice', role: 'admin' },
  { name: 'Bob', role: 'user' },
  { name: 'Charlie', role: 'user' }
]

const grouped = groupBy(users, 'role')
// {
//   admin: [{ name: 'Alice', role: 'admin' }],
//   user: [
//     { name: 'Bob', role: 'user' },
//     { name: 'Charlie', role: 'user' }
//   ]
// }

按函数分组

typescript
const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 25 }
]

const grouped = groupBy(users, user => 
  user.age >= 30 ? 'senior' : 'junior'
)
// {
//   junior: [
//     { name: 'Alice', age: 25 },
//     { name: 'Charlie', age: 25 }
//   ],
//   senior: [{ name: 'Bob', age: 30 }]
// }