aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ng/filter/limitTo.js83
1 files changed, 50 insertions, 33 deletions
diff --git a/src/ng/filter/limitTo.js b/src/ng/filter/limitTo.js
index 536c7038..bbbeb83c 100644
--- a/src/ng/filter/limitTo.js
+++ b/src/ng/filter/limitTo.js
@@ -6,20 +6,20 @@
* @function
*
* @description
- * Creates a new array containing only a specified number of elements in an array. The elements
- * are taken from either the beginning or the end of the source array, as specified by the
- * value and sign (positive or negative) of `limit`.
+ * Creates a new array or string containing only a specified number of elements. The elements
+ * are taken from either the beginning or the end of the source array or string, as specified by
+ * the value and sign (positive or negative) of `limit`.
*
* Note: This function is used to augment the `Array` type in Angular expressions. See
* {@link ng.$filter} for more information about Angular arrays.
*
- * @param {Array} array Source array to be limited.
- * @param {string|Number} limit The length of the returned array. If the `limit` number is
- * positive, `limit` number of items from the beginning of the source array are copied.
- * If the number is negative, `limit` number of items from the end of the source array are
- * copied. The `limit` will be trimmed if it exceeds `array.length`
- * @returns {Array} A new sub-array of length `limit` or less if input array had less than `limit`
- * elements.
+ * @param {Array|string} input Source array or string to be limited.
+ * @param {string|number} limit The length of the returned array or string. If the `limit` number
+ * is positive, `limit` number of items from the beginning of the source array/string are copied.
+ * If the number is negative, `limit` number of items from the end of the source array/string
+ * are copied. The `limit` will be trimmed if it exceeds `array.length`
+ * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array
+ * had less than `limit` elements.
*
* @example
<doc:example>
@@ -27,59 +27,76 @@
<script>
function Ctrl($scope) {
$scope.numbers = [1,2,3,4,5,6,7,8,9];
- $scope.limit = 3;
+ $scope.letters = "abcdefghi";
+ $scope.numLimit = 3;
+ $scope.letterLimit = 3;
}
</script>
<div ng-controller="Ctrl">
- Limit {{numbers}} to: <input type="integer" ng-model="limit">
- <p>Output: {{ numbers | limitTo:limit }}</p>
+ Limit {{numbers}} to: <input type="integer" ng-model="numLimit">
+ <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
+ Limit {{letters}} to: <input type="integer" ng-model="letterLimit">
+ <p>Output letters: {{ letters | limitTo:letterLimit }}</p>
</div>
</doc:source>
<doc:scenario>
- it('should limit the numer array to first three items', function() {
- expect(element('.doc-example-live input[ng-model=limit]').val()).toBe('3');
- expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3]');
+ it('should limit the number array to first three items', function() {
+ expect(element('.doc-example-live input[ng-model=numLimit]').val()).toBe('3');
+ expect(element('.doc-example-live input[ng-model=letterLimit]').val()).toBe('3');
+ expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3]');
+ expect(binding('letters | limitTo:letterLimit')).toEqual('abc');
});
it('should update the output when -3 is entered', function() {
- input('limit').enter(-3);
- expect(binding('numbers | limitTo:limit')).toEqual('[7,8,9]');
+ input('numLimit').enter(-3);
+ input('letterLimit').enter(-3);
+ expect(binding('numbers | limitTo:numLimit')).toEqual('[7,8,9]');
+ expect(binding('letters | limitTo:letterLimit')).toEqual('ghi');
});
it('should not exceed the maximum size of input array', function() {
- input('limit').enter(100);
- expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3,4,5,6,7,8,9]');
+ input('numLimit').enter(100);
+ input('letterLimit').enter(100);
+ expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3,4,5,6,7,8,9]');
+ expect(binding('letters | limitTo:letterLimit')).toEqual('abcdefghi');
});
</doc:scenario>
</doc:example>
*/
function limitToFilter(){
- return function(array, limit) {
- if (!(array instanceof Array)) return array;
+ return function(input, limit) {
+ if (!isArray(input) && !isString(input)) return input;
+
limit = int(limit);
+
+ if (isString(input)) {
+ //NaN check on limit
+ if (limit) {
+ return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);
+ } else {
+ return "";
+ }
+ }
+
var out = [],
i, n;
- // check that array is iterable
- if (!array || !(array instanceof Array))
- return out;
-
// if abs(limit) exceeds maximum length, trim it
- if (limit > array.length)
- limit = array.length;
- else if (limit < -array.length)
- limit = -array.length;
+ if (limit > input.length)
+ limit = input.length;
+ else if (limit < -input.length)
+ limit = -input.length;
if (limit > 0) {
i = 0;
n = limit;
} else {
- i = array.length + limit;
- n = array.length;
+ i = input.length + limit;
+ n = input.length;
}
for (; i<n; i++) {
- out.push(array[i]);
+ out.push(input[i]);
}
return out;