conductor
Version:
A modern & functional JavaScript utility library
86 lines (60 loc) • 2.53 kB
Markdown
---
description: Filter a collection
---
# filter
```erlang
filter :: (Function predicate, Collection collection) => Collection | Promise<Collection>
```
## description
Iterates over a _collection_ \(`Array, Object, Map, Set`\) and returns a new collection of the same type containing only the values for which the `predicate` function evaluates to `true`.
Like many `Collection` methods in Conductor, `filter` works with **both asynchronous & synchronous** mappers. If you use a synchronous predicate function, `filter` will work like `Array.prototype.filter` and return a Collection synchronously.
```javascript
const values = [0, 1, 2, 3]
const isEven = x => x % 2 === 0
filter(isEven, values) // [0, 2]
```
If you use an _asynchronous_ mapper, `filter` will return a `Promise`, and you will need to use `await` or `Promise.prototype.then` to retrieve the new collection.
```javascript
const values = [0, 1, 2, 3]
const isEven = async x => x % 2 === 0
filter(double, values) // Promise<Pending>
await filter(double, values) // [0, 2]
```
{% hint style="warning" %}
If you use an _asynchronous_ predicate function, all calls to the `predicate` function will be done in **parallel**, but the input collection's **order will be preserved**.
{% endhint %}
## examples
### basic example
```javascript
import { filter } from 'conductor'
const values = [0, 1, 2, 3]
const isEven = x => x % 2 === 0
filter(isEven, values) // [0, 2]
```
Here, we are just using filtering on an array to keep only even values. The predicate function is synchronous.
### other data structures
```javascript
import { filter } from 'conductor'
const object = { drummer: 1, drumsticks: 2 }
const map = new Map([['drummer', 1], ['drumsticks', 2]])
const set = new Set([0, 1, 2, 3])
const isEven = x => x % 2 === 0
filter(isEven, object) // { drumsticks: 2 }
filter(isEven, map) // Map { 'drumsticks' => 2 }
filter(isEven, set) // Set { 0, 2 }
```
### using the index in the predicate function
```javascript
import { filter } from 'conductor'
const words = ['hello', 'hello', 'world', 'world']
const isEven = x => x % 2 === 0
filter((_, index) => isEven(index), words) // ['hello', 'world']
```
### using an asynchronous predicate
```javascript
import { filter } from 'conductor'
const values = [0, 1, 2, 3]
const isEven = async x => x % 2 === 0
await filter(double, values) // [0, 2]
```
If your predicate function is _asynchronous_, you will need to use `await` \(or `Promise.prototype.then`\) because the result will be a `Promise`.