An open API service indexing awesome lists of open source software.

https://github.com/shuckster/sift-r

Apportion objects / arrays into multiple buckets based on a predicate / pattern.
https://github.com/shuckster/sift-r

apportioning filtering grouping partition sifting splitting

Last synced: 5 months ago
JSON representation

Apportion objects / arrays into multiple buckets based on a predicate / pattern.

Awesome Lists containing this project

README

          


sift-r 📥



MIT license


Downloads per week


npm bundle size


Version

A complement to [match-iz](https://github.com/shuckster/match-iz) for filtering objects, arrays, and `Map`/`Set` based on a `match-iz` pattern.

- 🗺 [byPattern() for map/filter](#bypattern)
- 📥 [sift() an object](#sift-an-object)
- 📁 [sift() an array](#sift-an-array)
- 🗂 [sift() an array into multiple buckets](#sift-an-array-into-multiple-buckets)
- 🗺 [sift() a Map or Set](#sift-a-map-or-set)
- 🔢 [sift() an iterable](#sift-an-iterable)
- 📖 [Documentation](https://github.com/shuckster/sift-r/wiki)
- 📀 [Install / Use](#install--use)

### `byPattern()`

```js
import { byPattern } from 'sift-r'

const filtered = [
{ user: 'barney', age: 36, active: false },
{ user: 'fred', age: 40, active: true },
{ user: 'pebbles', age: 1, active: false }
].filter(
byPattern({
age: 36
})
)

// filtered ===
// [
// { user: 'barney', age: 36, active: false }
// ]

import { pluck, isNumber } from 'match-iz'

const mapped = [
{ user: 'barney', age: 36, active: false },
{ user: 'fred', age: 40, active: true },
{ user: 'pebbles', age: 1, active: false },
{ user: '', age: 'not-a-number', active: true }
].map(
byPattern({
age: pluck(isNumber)
})
)

// mapped === [36, 40, 1, undefined]
```

### `sift()` an object

```js
import { sift } from 'sift-r'

const isString = x => typeof x === 'string'
const isNumber = x => typeof x === 'number'

const [strValues, numValues, neither] = sift(
{
title: 'header',
slug: 1,
markdown: '# header',
footer: undefined
},
[isString, isNumber]
)

// strValues ===
// {
// title: 'header',
// markdown: '# header'
// }

// numValues ===
// {
// slug: 1
// }

// neither ===
// {
// footer: undefined
// }
```

### `sift()` an array

(+using [match-iz](https://github.com/shuckster/match-iz) pattern-helpers)

```js
import { sift } from 'sift-r'
import { gte, allOf } from 'match-iz'

const users = [
{ user: 'barney', age: 36, active: false },
{ user: 'fred', age: 40, active: true },
{ user: 'pebbles', age: 1, active: true }
]

const isActive = { active: true }
const isGrownUp = { age: gte(18) }
const isActiveGrownUp = allOf(isActive, isGrownUp)

const [activeGrownUps, everyoneElse] = sift(users, isActiveGrownUp)

// activeGrownUps ===
// [
// { user: 'fred', age: 40, active: true }
// ]

// everyoneElse ===
// [
// { user: 'barney', age: 36, active: false },
// { user: 'pebbles', age: 1, active: true }
// ]
```

### `sift()` an array into multiple buckets

```js
import { sift } from 'sift-r'
import { lt } from 'match-iz'

const [oneYearOlds, lessThan40, theRest] = sift(
[
{ user: 'barney', age: 36, active: false },
{ user: 'fred', age: 40, active: true },
{ user: 'pebbles', age: 1, active: false }
],
{ age: 1, active: false },
{ age: lt(40) }
)

// oneYearOlds ===
// [{ user: 'pebbles', age: 1, active: false }]

// lessThan40 ===
// [{ user: 'barney', age: 36, active: false }]

// theRest ===
// [{ user: 'fred', age: 40, active: true }]
```

### `sift()` a `Map` or `Set`

`Set` example:

```js
import { sift } from 'sift-r'
import { lt } from 'match-iz'

const [oneYearOlds, lessThan40, theRest] = sift(
new Set([
{ user: 'barney', age: 36, active: false },
{ user: 'fred', age: 40, active: true },
{ user: 'pebbles', age: 1, active: false }
]),
{ age: 1, active: false },
{ age: lt(40) }
)

// oneYearOlds ===
// new Set([
// { user: 'pebbles', age: 1, active: false }
// ])

// lessThan40 ===
// new Set([
// { user: 'barney', age: 36, active: false }
// ])

// theRest ===
// new Set([
// { user: 'fred', age: 40, active: true }
// ])
```

`Map` example:

```js
import { sift } from 'sift-r'
import { lt } from 'match-iz'

const [oneYearOlds, lessThan40, theRest] = sift(
new Map([
[0, { user: 'barney', age: 36, active: false }],
[1, { user: 'fred', age: 40, active: true }],
[2, { user: 'pebbles', age: 1, active: false }]
]),
{ age: 1, active: false },
{ age: lt(40) }
)

// oneYearOlds ===
// new Map([
// [2, { user: 'pebbles', age: 1, active: false }]
// ])

// lessThan40 ===
// new Map([
// [0, { user: 'barney', age: 36, active: false }]
// ])

// theRest ===
// new Map([
// [1, { user: 'fred', age: 40, active: true }]
// ])
```

### `sift()` an iterable

```js
import { sift } from 'sift-r'
import { lt } from 'match-iz'

function* flintstones() {
yield { user: 'barney', age: 36, active: false }
yield { user: 'fred', age: 40, active: true }
yield { user: 'pebbles', age: 1, active: false }
}

const [oneYearOlds, lessThan40, theRest] = sift(
flintstones(),
{ age: 1, active: false },
{ age: lt(40) }
)

// oneYearOlds ===
// [{ user: 'pebbles', age: 1, active: false }]

// lessThan40 ===
// [{ user: 'barney', age: 36, active: false }]

// theRest ===
// [{ user: 'fred', age: 40, active: true }]
```

## Install / Use

```
$ pnpm i sift-r
```

Supports `import`/`require` for ESM/CJS.

Browser/UMD version here:

```html

const { sift, byPattern } = siftr

```

# Documentation

`sift()` has several call-signatures, all of which are [documented on the Wiki](https://github.com/shuckster/sift-r/wiki).

# Credits

`sift-r` was written by [Conan Theobald](https://github.com/shuckster/).

I hope you found it useful! If so, I like [coffee ☕️](https://www.buymeacoffee.com/shuckster) :)

## License

MIT licensed: See [LICENSE](LICENSE)