Function

Module: @ember/object
import { filter } from '@ember/object/computed';
dependentKey
String
additionalDependentKeys
Array
optional array of additional dependent keys
callback
Function
returns
ComputedProperty
the filtered array

Filters the array by the callback, like the Array.prototype.filter method.

The callback method you provide should have the following signature:

  • item is the current item in the iteration.
  • index is the integer index of the current item in the iteration.
  • array is the dependant array itself.
1
function filterCallback(item, index, array);

In the callback, return a truthy value that coerces to true to keep the element, or a falsy to reject it.

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { set } from '@ember/object';
import { filter } from '@ember/object/computed';

class Hamster {
  constructor(chores) {
    set(this, 'chores', chores);
  }

  @filter('chores', function(chore, index, array) {
    return !chore.done;
  })
  remainingChores;
}

let hamster = Hamster.create([
  { name: 'cook', done: true },
  { name: 'clean', done: true },
  { name: 'write more unit tests', done: false }
]);

hamster.remainingChores; // [{name: 'write more unit tests', done: false}]

You can also use @each.property in your dependent key, the callback will still use the underlying array:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { set } from '@ember/object';
import { filter } from '@ember/object/computed';

class Hamster {
  constructor(chores) {
    set(this, 'chores', chores);
  }

  @filter('chores.@each.done', function(chore, index, array) {
    return !chore.done;
  })
  remainingChores;
}

let hamster = new Hamster([
  { name: 'cook', done: true },
  { name: 'clean', done: true },
  { name: 'write more unit tests', done: false }
]);
hamster.remainingChores; // [{name: 'write more unit tests', done: false}]

set(hamster.chores[2], 'done', true);
hamster.remainingChores; // []

Finally, you can optionally pass an array of additional dependent keys as the second parameter to the macro, if your filter function relies on any external values:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { filter } from '@ember/object/computed';

class Hamster {
  constructor(chores) {
    set(this, 'chores', chores);
  }

  doneKey = 'finished';

  @filter('chores', ['doneKey'], function(chore, index, array) {
    return !chore[this.doneKey];
  })
  remainingChores;
}

let hamster = new Hamster([
  { name: 'cook', finished: true },
  { name: 'clean', finished: true },
  { name: 'write more unit tests', finished: false }
]);

hamster.remainingChores; // [{name: 'write more unit tests', finished: false}]