Observable: filter() method

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.

The filter() method of the Observable interface returns a new observable that emits only those values of the source observable for which the provided callback function returns a truthy value.

Syntax

js
filter(predicate)

Parameters

predicate

A function to execute for each value emitted by the source observable. It should return a truthy value to have the value emitted by the returned observable, and a falsy value otherwise. The function is called with the following arguments:

value

The current value being processed.

index

The index of the current value being processed, starting from 0.

Return value

A new Observable. When subscribed to, it calls predicate for each value emitted by the source observable and emits the value only if predicate returns a truthy value. When the source completes, the returned observable also completes.

Description

Like other observable-returning operators, this method is lazy: calling it creates a new observable without subscribing to the source. Processing starts when the returned observable is subscribed to.

If predicate throws an exception, the returned observable errors and unsubscribes from the source. Errors from the source are also forwarded.

The index counts all source values, including those that are filtered out. The return value of predicate is converted to a boolean without awaiting it, so an async function returns a truthy promise object regardless of its eventual result.

Examples

Using filter()

This example displays the mouse coordinates only when the pointer moves over either of two <div> elements. The filter excludes events whose target is another element.

js
const outputElem = document.querySelector("p");

document.body
  .when("mousemove")
  .filter((e) => e.target.matches("div"))
  .map((e) => ({ x: e.clientX, y: e.clientY }))
  .subscribe({ next: reportCoords });

function reportCoords(e) {
  outputElem.textContent = `${e.x},${e.y}`;
}

Specifications

Specification
Observable
# dom-observable-filter

Browser compatibility

See also