Skip to content

Commit

Permalink
Add reject filter
Browse files Browse the repository at this point in the history
  • Loading branch information
ogonkov authored and fdintino committed Jul 9, 2020
1 parent 647fc11 commit 62565a1
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 10 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ Changelog
=========

* Add [`select` filter](https://mozilla.github.io/nunjucks/templating.html#select).
* Add [`reject` filter](https://mozilla.github.io/nunjucks/templating.html#reject).

3.2.1 (Mar 17 2020)
-------------------
Expand Down
26 changes: 26 additions & 0 deletions docs/templating.md
Original file line number Diff line number Diff line change
Expand Up @@ -1389,6 +1389,32 @@ Select a random value from an array.

A random value between 1-9 (inclusive).

### reject

Filters a sequence of objects by applying a test to each object, and rejecting
the objects with the test succeeding.

If no test is specified, each object will be evaluated as a boolean.

**Input**

```jinja
{% set numbers=[0, 1, 2, 3, 4, 5] %}
{{ numbers | reject("odd") | join }}
{{ numbers | reject("even") | join }}
{{ numbers | reject("divisibleby", 3) | join }}
{{ numbers | reject() | join }}
```

**Output**

```jinja
024
135
1245
0
```

### rejectattr (only the single-argument form)

Expand Down
32 changes: 22 additions & 10 deletions nunjucks/src/filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,22 +266,34 @@ function random(arr) {

exports.random = random;

/**
* Construct select or reject filter
*
* @param {boolean} expectedTestResult
* @returns {function(array, string, *): array}
*/
function getSelectOrReject(expectedTestResult) {
function filter(arr, testName = 'truthy', secondArg) {
const context = this;
const test = context.env.getTest(testName);

return lib.toArray(arr).filter(function examineTestResult(item) {
return test.call(context, item, secondArg) === expectedTestResult;
});
}

return filter;
}

exports.reject = getSelectOrReject(false);

function rejectattr(arr, attr) {
return arr.filter((item) => !item[attr]);
}

exports.rejectattr = rejectattr;

function select(arr, testName = 'truthy', secondArg) {
const context = this;
const test = context.env.getTest(testName);

return arr.filter(function applyToTest(item) {
return test.call(context, item, secondArg);
});
}

exports.select = select;
exports.select = getSelectOrReject(true);

function selectattr(arr, attr) {
return arr.filter((item) => !!item[attr]);
Expand Down
16 changes: 16 additions & 0 deletions tests/filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,22 @@
finish(done);
});

it('reject', function(done) {
var context = {
numbers: [0, 1, 2, 3, 4, 5]
};

equal('{{ numbers | reject("odd") | join }}', context, '024');

equal('{{ numbers | reject("even") | join }}', context, '135');

equal('{{ numbers | reject("divisibleby", 3) | join }}', context, '1245');

equal('{{ numbers | reject() | join }}', context, '0');

finish(done);
});

it('rejectattr', function(done) {
var foods = [{
tasty: true
Expand Down

0 comments on commit 62565a1

Please sign in to comment.