-
Notifications
You must be signed in to change notification settings - Fork 331
Collection filters
###concat
Concatenates an array/object into another one.
function MainController ($scope) {
$scope.array = [ {a: 1}, {a: 2} ];
$scope.object = {
0: {a: 3},
1: {a: 4}
};
}
<li ng-repeat="elm in array | concat:object">
{{ elm.a }}
</li>
<!--
result:
1 2 3 4
-->
<li ng-repeat="elm in object | concat:array">
{{ elm.a }}
</li>
<!--
result:
3 4 1 2
-->
###unique
Remove duplicates from an array/object.
If a string is provided, it will filter out duplicates using the provided expression.
Usage: collection | unique: 'property'
aliases: uniq
function MainController ($scope) {
$scope.orders = [
{ id:1, customer: { name: 'John', id: 10 } },
{ id:2, customer: { name: 'William', id: 20 } },
{ id:3, customer: { name: 'John', id: 10 } },
{ id:4, customer: { name: 'William', id: 20 } },
{ id:5, customer: { name: 'Clive', id: 30 } },
];
}
Ex: Filter by customer.id
<th>Customer list:</th>
<tr ng-repeat="order in orders | unique: 'customer.id'" >
<td> {{ order.customer.name }} , {{ order.customer.id }} </td>
</tr>
<!-- result:
All customers list:
John 10
William 20
Clive 30
###filterBy
Filter a collection by a specific property.
Usage: collection | filterBy: [prop, nested.prop, etc..]: search
Note: You can even use compound properties (e.g: |filterBy: [property + property]: model
)
$scope.users = [
{ id: 1, user: { first_name: 'Rob', last_name: 'John', mobile: 4444 } },
{ id: 2, user: { first_name: 'John', last_name: 'Wayne', mobile: 3333 } },
{ id: 3, user: { first_name: 'Rob', last_name: 'Johansson', mobile: 2222 } },
{ id: 4, user: { first_name: 'Mike', last_name: 'Terry', mobile: 1111 } }
];
Return users whose id is 1
<!--search only by id -->
<th ng-repeat="user in users | filterBy: ['id']: 1">
{{ user.id }} : {{ user.first_name }} {{ user.last_name }}
</th>
<!--result:
1: Rob John
-->
Return users whose first name or last name is 'John' (uses nested properties).
<!--search by first_name and last_name -->
<th ng-repeat="user in users | filterBy: ['user.first_name', 'user.last_name']: 'John'">
{{ user.first_name }} {{ user.last_name }}
</th>
<!--result:
1: Rob John
2: John Wayne
-->
Return users whose full name is
<!--search by full name -->
<th ng-repeat="user in users | filterBy: ['user.first_name + user.last_name']: 'Rob Joh'">
{{ user.id }}: {{ user.first_name }} {{ user.last_name }}
</th>
<!--result:
1: Rob John
3: Rob Johannson
-->
###first
Gets the first element(s) of a collection.
If an expression is provided, it will only return elements whose expression is truthy.
Usage: See below
$scope.users = [
{ id: 1, name: { first: 'John', last: 'Wayne' } },
{ id: 2, name: { first: 'Mike', last: 'Johannson' } },
{ id: 3, name: { first: 'William', last: 'Kyle' } },
{ id: 4, name: { first: 'Rob', last: 'Thomas' } }
];
Returns the first user.
{{ users | first }}
<!--result:
{ id: 1, name: { first: 'John', last: 'Wayne' } }
-->
Returns the first user whose first name is 'Rob' and last name is 'Thomas'
<!-- collection | first: expression -->
{{ users | first: 'name.first === \'Rob\' && name.last === \'Thomas\'' }}
<!--result:
[ { id: 4, name: { first: 'Rob', last: 'Thomas' } } ]
-->
Return the first two users
<!-- collection | first: n -->
<th ng-repeat="user in users | first: 2">
{{ user.name.first }}
</th>
<!--result:
John
Mike
-->
Return the first two users with even id
<!-- collection | first: n: expression -->
<th ng-repeat="user in users | first: 2: '!(id%2)'">
{{ user.name }}
</th>
<!--result:
Mike
Rob
###last
Gets the last element or last n elements of a collection,
if expression is provided, is returns as long the expression return truthy
Usage: See below
$scope.users = [
{ id: 1, name: { first: 'foo', last: 'bar' } },
{ id: 2, name: { first: 'baz', last: 'bar' } },
{ id: 3, name: { first: 'bar', last: 'bar' } },
{ id: 4, name: { first: 'lol', last: 'bar' } }
];
{{ users | last }}
<!--result:
{ id: 4, name: { first: 'lol', last: 'bar' } }
<!-- collection | last: expression -->
{{ users | last: 'name.last === \'bar\'' }}
<!--result:
[ { id: 4, name: { first: 'lol', last: 'bar' } } ]
<!-- collection | last: n -->
<th ng-repeat="user in users | last: 2">
{{ user.name }}
</th>
<!--result:
bar
lol
<!-- collection | last: n: expression -->
<th ng-repeat="user in users | last: 2: '!(id%2)'">
{{ user.name }}
</th>
<!--result:
baz
lol
###flatten
Flattens a nested array (the nesting can be to any depth).
If you pass shallow, the array will only be flattened a single level
Usage: collection | flatten: shallow[optional]
$scope.weirdArray = [[], 1, 2, 3, [4, 5, 6, [7, 8, 9, [10, 11, [12, [[[[[13], [[[[14, 15]]]]]]]]]]]]];
<th ng-repeat="elm in wierdArray | flatten">
{{ elm }},
</th>
<!--result:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
###fuzzy
fuzzy string searching(approximate string matching). Read more
note: use fuzzyBy to filter by one property to improve performance
Usage: collection | fuzzy: search: caseSensitive[optional]
$scope.books = [
{ title: 'The DaVinci Code', author: 'F. Scott Fitzgerald' },
{ title: 'The Great Gatsby', author: 'Dan Browns' },
{ title: 'Angels & Demons', author: 'Dan Louis' },
{ title: 'The Lost Symbol', author: 'David Maine' },
{ title: 'Old Man\'s War', author: 'Rob Grant' }
];
<input type="text" ng-model="search" placeholder="search book" />
<li ng-repeat="book in books | fuzzy: search">
{{ book.title }}
</li>
<!--case sensitive-->
<li ng-repeat="book in books | fuzzy: search: true">
{{ book.title }}
</li>
###fuzzyBy
fuzzy string searching(approximate string matching) by property(nested to). Read more
usage: collection | fuzzyBy: 'property': search: caseSensitive[optional]
$scope.books = [
{ title: 'The DaVinci Code' },
{ title: 'The Great Gatsby' },
{ title: 'Angels & Demons' },
{ title: 'The Lost Symbol' },
{ title: 'Old Man\'s War' }
];
<input type="text" ng-model="search" placeholder="search by title" />
<li ng-repeat="book in books | fuzzyBy: 'title': search">
{{ book.title }}
</li>
<!--case sensitive-->
<li ng-repeat="book in books | fuzzyBy: 'title': search: true">
{{ book.title }}
</li>
###groupBy
Create an object composed of keys generated from the result of running each element of a collection,
each key is an array of the elements.
usage: (key, value) in collection | groupBy: 'property'
or ... | groupBy: 'nested.property'
$scope.players = [
{name: 'Gene', team: 'alpha'},
{name: 'George', team: 'beta'},
{name: 'Steve', team: 'gamma'},
{name: 'Paula', team: 'beta'},
{name: 'Scruath', team: 'gamma'}
];
<ul ng-repeat="(key, value) in players | groupBy: 'team'" >
Group name: {{ key }}
<li ng-repeat="player in value">
player: {{ player.name }}
</li>
</ul>
<!-- result:
Group name: alpha
* player: Gene
Group name: beta
* player: George
* player: Paula
Group name: gamma
* player: Steve
* player: Scruath
###countBy
Create an object composed of keys generated from the result of running each element of a collection,
each key is the count of objects in each group
usage: (key, value) in collection | countBy: 'property'
or ... | countBy: 'nested.property'
$scope.players = [
{name: 'Gene', team: 'alpha'},
{name: 'George', team: 'beta'},
{name: 'Steve', team: 'gamma'},
{name: 'Paula', team: 'beta'},
{name: 'Scruath', team: 'gamma'}
];
<ul ng-repeat="(key, value) in players | countBy: 'team'" >
Group name: {{ key }}, length: {{ value }}
</ul>
<!-- result:
Group name: alpha, length: 1
Group name: beta, length: 2
Group name: gamma, length: 2
###where
comparison for each element in a collection to the given properties object,
returning an array of all elements that have equivalent property values.
$scope.collection = [
{ id: 1, name: 'foo' },
{ id: 1, name: 'bar' },
{ id: 2, name: 'baz' }
]
<tr ng-repeat="obj in collection | where:{id: 1}">
{{ obj.name }}
</tr>
<!-- result:
foo
bar
-->
<tr ng-repeat="obj in collection | where:{id: 1, name: 'foo'}">
{{ obj.name }}
</tr>
<!-- result:
foo
-->
###omit
return collection without the omitted objects(by expression).
usage: collection | omit: expression
example 1:
$scope.mod2 = function(elm) {
return !(elm % 2);
}
<tr ng-repeat="num in [1,2,3,4,5,6] | omit: mod2">
{{ num }},
</tr>
<!--result
1, 3, 5
example 2:
$scope.collection = [
{ id: 1, user: { name: 'foo' } },
{ id: 2, user: { name: 'bar' } },
{ id: 3, user: { name: 'baz' } }
]
<tr ng-repeat="obj in collection | omit:'id > 1 && user.name.indexOf(\'b\') !== -1'">
id: {{ obj.id }}, name: {{ obj.user.name }}
</tr>
<!--result:
id: 1, name: foo
###pick
return collection composed of the picked objects(by expression).
usage: collection | pick: expression
example 1:
$scope.mod2 = function(elm) {
return !(elm % 2);
}
<tr ng-repeat="num in [1,2,3,4,5,6] | pick: mod2">
{{ num }},
</tr>
<!--result
2, 4, 6
example 2:
$scope.collection = [
{ id: 1, user: { name: 'foo' } },
{ id: 2, user: { name: 'bar' } },
{ id: 3, user: { name: 'baz' } }
]
<tr ng-repeat="obj in collection | pick:'id > 1 && user.name.indexOf(\'b\') !== -1'">
id: {{ obj.id }}, name: {{ obj.user.name }}
</tr>
<!--result:
id: 2, name: bar
id:3, name: baz
###remove Returns a new collection of removed elements.
$scope.foo = { name: 'foo' };
$scope.collection = [
{ name: 'bar' },
$scope.foo,
null, 1
];
<tr ng-repeat="obj in collection | remove: foo: null: 1">
{{ obj }}
</tr>
<!-- result:
{ "name": "bar" }
###removeWith
comparison for each element in a collection to the given properties object,
returning an array without all elements that have equivalent property values.
$scope.collection = [
{ id: 1, name: 'foo' },
{ id: 1, name: 'bar' },
{ id: 2, name: 'baz' }
]
<tr ng-repeat="obj in collection | removeWith:{ id: 1 }">
{{ obj.name }}
</tr>
<!-- result:
baz
-->
<tr ng-repeat="obj in collection | removeWith:{ id: 1, name: 'foo' }">
{{ obj.name }}
</tr>
<!-- result:
bar
baz
###searchField
if you want to use the filter in angular and want to filter for multiple values
so searchField filter return new collection with property called searchField
support nested properties with dot notation i.e: collection | searchFiled: 'prop': 'nested.prop'
$scope.users = [
{ first_name: 'Sharon', last_name: 'Melendez' },
{ first_name: 'Edmundo', last_name: 'Hepler' },
{ first_name: 'Marsha', last_name: 'Letourneau' }
];
<input ng-model="search" placeholder="search by full name"/>
<th ng-repeat="user in users | searchField: 'first_name': 'last_name' | filter: search">
{{ user.first_name }} {{ user.last_name }}
</th>
<!-- so now you can search by full name -->
###after get a collection(array or object) and specified count, and returns all of the items in the collection after the specified count.
$scope.collection = [
{ name: 'foo' },
{ name: 'bar' },
{ name: 'baz' },
{ name: 'zap' },
];
<tr ng-repeat="col in collection | after:2">
{{ col.name }}
</tr>
<!--result:
baz
zap
-->
###afterWhere get a collection and properties object, and returns all of the items, in the collection after the first that found with the given properties, including it.
$scope.orders = [
{ id: 1, customer: { name: 'foo' }, date: 'Tue Jul 15 2014' },
{ id: 2, customer: { name: 'foo' }, date: 'Tue Jul 16 2014' },
{ id: 3, customer: { name: 'foo' }, date: 'Tue Jul 17 2014' },
{ id: 4, customer: { name: 'foo' }, date: 'Tue Jul 18 2014' },
{ id: 5, customer: { name: 'foo' }, date: 'Tue Jul 19 2014' }
];
<tr ng-repeat="order in orders | afterWhere:{ date: 'Tue Jul 17 2014' }">
order: {{ order.id }}, {{ order.date }}
</tr>
<!--result:
order: 3, Tue Jul 17 2014
order: 4, Tue Jul 18 2014
order: 5, Tue Jul 19 2014
-->
###before get a collection(array or object) and specified count, and returns all of the items in the collection before the specified count.
$scope.collection = [
{ name: 'foo' },
{ name: 'bar' },
{ name: 'baz' },
{ name: 'zap' },
];
<tr ng-repeat="col in collection | before:3">
{{ col.name }}
</tr>
<!--result:
foo
bar
-->
###beforeWhere get a collection and properties object, and returns all of the items, in the collection before the first that found with the given properties, including it.
$scope.orders = [
{ id: 1, customer: { name: 'foo' }, date: 'Tue Jul 15 2014' },
{ id: 2, customer: { name: 'foo' }, date: 'Tue Jul 16 2014' },
{ id: 3, customer: { name: 'foo' }, date: 'Tue Jul 17 2014' },
{ id: 4, customer: { name: 'foo' }, date: 'Tue Jul 18 2014' },
{ id: 5, customer: { name: 'foo' }, date: 'Tue Jul 19 2014' }
];
<tr ng-repeat="order in orders | beforeWhere:{ date: 'Tue Jul 17 2014' }">
order: {{ order.id }}, {{ order.date }}
</tr>
<!--result:
order: 1, Tue Jul 15 2014
order: 2, Tue Jul 16 2014
order: 3, Tue Jul 17 2014
-->
###reverse Reverse the order of the elements in a collection
$scope.users = [
{ id: 1, name: 'bazzy' },
{ id: 2, name: 'dazzy' },
{ id: 3, name: 'lazzy' }
];
<tr ng-repeat="user in users | reverse">
user: {{ user.id }}, {{ user.name }}
</tr>
<!--result:
user: 3, lazzy
user: 2, dazzy,
user: 1, bazzy
-->
###isEmpty get collection or string and return if it empty[Bollean]
<tr ng-repeat="order in orders" ng-hide="orders | isEmpty">
<!-- ..... -->
</tr>
<!--some replacer msg-->
<tr ng-show="orders | isEmpty">
no content to show
</tr>
###contains
Checks if given expression(or value) is present in one or more object in the collection
Usage: collection | contains: 'expression'
Aliases: some
example 1:
$scope.array = [1,2,3,4];
<th ng-show="{{ array | contains: 2 }}">...</th>
example 2:
$scope.collection = [
{ user: { id: 1, name: 'foo' } },
{ user: { id: 2, name: 'bar' } },
{ user: { id: 3, name: 'baz' } }
];
<th ng-show="{{ collection | some: '!(user.id % 2) && user.name.indexOf(\'b\') === 0' }}">...</th>
<!--result: true
###every
Checks if given expression(or value) return truthy value for all members of a collection
Usage: collection | every: 'expression'
example 1:
$scope.array = [1,1,1,1];
<th ng-show="{{ array | every: 1 }}">...</th>
<!--result: true
example 2:
$scope.collection = [
{ user: { id: 4, name: 'foo' } },
{ user: { id: 6, name: 'bar' } },
{ user: { id: 8, name: 'baz' } }
];
<th ng-show="{{ collection | every: !(user.id % 2) }}">...</th>
<!--result: true
###xor
Exclusive or between two collection
Usage: collection1 | xor: collection2: expression[optional]
Example1:
<p ng-repeat="elm in [1,2,3,4] | xor: [2,3,5]">
{{ elm }}
</p>
<!--result:
1 4 5
Example2:
$scope.users1 = [
{ id: 0, details: { first_name: 'foo', last_name: 'bar' } },
{ id: 1, details: { first_name: 'foo', last_name: 'baz' } },
{ id: 2, details: { first_name: 'foo', last_name: 'bag' } }
];
$scope.users2 = [
{ id: 3, details: { first_name: 'foo', last_name: 'bar' } },
{ id: 4, details: { first_name: 'foo', last_name: 'baz' } }
];
<th ng-repeat="user in users1 | xor: users2">
{{ user.id }}
</th>
<!--result:
1 2 3 4 5
-->
<th ng-repeat="user in users1 | xor: users2: 'details.last_name'">
{{ user.id }}, {{ user.details.first_name }} {{ user.details.last_name }}
</th>
<!--result:
2, foo bag
###toArray
Convert objects into stable arrays.
Usage: object | toArray: addKey[optional]
if addKey set to true,the filter also attaches a new property $key to the value containing the original key that was used in the object we are iterating over to reference the property
<th ng-repeat="elm in object | toArray | orderBy: 'property'">
{{ elm.name }}
</th>
###map
Returns a new collection of the results of each expression execution.
Usage: collection | map: expression
Example1:
$scope.divide = function(elm) {
return elm/2
}
<th ng-repeat="i in [1, 2, 3, 4, 5] | map: divide">
{{ i }}
</th>
<!--result:
0.5, 1, 1.5, 2, 2.5
###pluck Used map
$scope.users = [
{ id:1, user: { name: 'Foo' } },
{ id:1, user: { name: 'Bar' } },
{ id:1, user: { name: 'Baz' } }
];
<th ng-repeat="name in users | map: 'user.name' ">
{{ name }}
</th>
<!--result:
Foo
Bar
Baz