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[]>>;