Skip to content

groupBy

Like Object.groupBy.

Demo

vue
<script setup lang="ts">
import { groupBy } from '.'

const data = [
  { type: 'apple', size: 2 },
  { type: 'banana', size: 3 },
  { type: 'pear', size: 2 },
  { type: 'mango', size: 1 },
  { type: 'apple', size: 4 },
  { type: 'banana', size: 6 },
  { type: 'pear', size: 6, special: true },
]
const show = JSON.stringify(
  groupBy(data, item => item.type),
  null,
  2,
)
</script>

<template>
  <pre>
    <code>
      {{ show }}
    </code>
  </pre>
</template>

    
      {
  "apple": [
    {
      "type": "apple",
      "size": 2
    },
    {
      "type": "apple",
      "size": 4
    }
  ],
  "banana": [
    {
      "type": "banana",
      "size": 3
    },
    {
      "type": "banana",
      "size": 6
    }
  ],
  "pear": [
    {
      "type": "pear",
      "size": 2
    },
    {
      "type": "pear",
      "size": 6,
      "special": true
    }
  ],
  "mango": [
    {
      "type": "mango",
      "size": 1
    }
  ]
}
    
  

Type Declarations

Details
ts
/**
 * Classify items in an iterable by a key.
 *
 * @example
 * ```ts
 * const data = [
 *   { type: 'apple', size: 2 },
 *   { type: 'banana', size: 3 },
 *   { type: 'pear', size: 2 },
 *   { type: 'mango', size: 1 },
 *   { type: 'apple', size: 4 },
 *   { type: 'banana', size: 6 },
 *   { type: 'pear', size: 6, special: true },
 * ]
 *
 * expect(groupBy(data, item => item.type)).toEqual({
 *   apple: [
 *     { type: 'apple', size: 2 },
 *     { type: 'apple', size: 4 },
 *   ],
 *   banana: [
 *     { type: 'banana', size: 3 },
 *     { type: 'banana', size: 6 },
 *   ],
 *   pear: [
 *     { type: 'pear', size: 2 },
 *     { type: 'pear', size: 6, special: true },
 *   ],
 *   mango: [
 *     { type: 'mango', size: 1 },
 *   ],
 * })
 *
 * expect(groupBy(data, item => item.size >= 3 ? 'big' : 'small')).toEqual(
 *   {
 *     big: [
 *       { size: 3, type: 'banana' },
 *       { size: 4, type: 'apple' },
 *       { size: 6, type: 'banana' },
 *       { size: 6, special: true, type: 'pear' },
 *     ],
 *     small: [
 *       { size: 2, type: 'apple' },
 *       { size: 2, type: 'pear' },
 *       { size: 1, type: 'mango' },
 *     ],
 *   },
 * )
 * ```
 *
 * @see {@link https://s3xysteak.github.io/fnclip/functions/object/groupBy/}
 */
export declare function groupBy<K extends PropertyKey, T>(iter: Iterable<T>, getKey: (element: T, index: number) => K): Partial<Record<K, T[]>>;

Source

SourceDemo