mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-05-12 17:03:09 +00:00
fix($limitTo): properly handle excessive limits
`angular.Array.limitTo`'s result should not exceed original input array size Closes #571
This commit is contained in:
parent
b7a7fc7065
commit
c115fa9924
2 changed files with 38 additions and 2 deletions
20
src/apis.js
20
src/apis.js
|
|
@ -697,8 +697,9 @@ var angularArray = {
|
||||||
* @param {string|Number} limit The length of the returned array. If the `limit` number is
|
* @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.
|
* 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
|
* If the number is negative, `limit` number of items from the end of the source array are
|
||||||
* copied.
|
* copied. The `limit` will be trimmed if it exceeds `array.length`
|
||||||
* @returns {Array} A new sub-array of length `limit`.
|
* @returns {Array} A new sub-array of length `limit` or less if input array had less than `limit`
|
||||||
|
* elements.
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
<doc:example>
|
<doc:example>
|
||||||
|
|
@ -718,6 +719,11 @@ var angularArray = {
|
||||||
input('limit').enter(-3);
|
input('limit').enter(-3);
|
||||||
expect(binding('numbers.$limitTo(limit) | json')).toEqual('[7,8,9]');
|
expect(binding('numbers.$limitTo(limit) | json')).toEqual('[7,8,9]');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should not exceed the maximum size of input array', function() {
|
||||||
|
input('limit').enter(100);
|
||||||
|
expect(binding('numbers.$limitTo(limit) | json')).toEqual('[1,2,3,4,5,6,7,8,9]');
|
||||||
|
});
|
||||||
</doc:scenario>
|
</doc:scenario>
|
||||||
</doc:example>
|
</doc:example>
|
||||||
*/
|
*/
|
||||||
|
|
@ -726,6 +732,16 @@ var angularArray = {
|
||||||
var out = [],
|
var out = [],
|
||||||
i, n;
|
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 > 0) {
|
if (limit > 0) {
|
||||||
i = 0;
|
i = 0;
|
||||||
n = limit;
|
n = limit;
|
||||||
|
|
|
||||||
|
|
@ -175,6 +175,26 @@ describe('api', function(){
|
||||||
expect(angular.Array.limitTo(items, null)).toEqual([]);
|
expect(angular.Array.limitTo(items, null)).toEqual([]);
|
||||||
expect(angular.Array.limitTo(items, undefined)).toEqual([]);
|
expect(angular.Array.limitTo(items, undefined)).toEqual([]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should return an empty array when input is not Array type', function() {
|
||||||
|
expect(angular.Array.limitTo('bogus', 1)).toEqual([]);
|
||||||
|
expect(angular.Array.limitTo(null, 1)).toEqual([]);
|
||||||
|
expect(angular.Array.limitTo(undefined, 1)).toEqual([]);
|
||||||
|
expect(angular.Array.limitTo(null, 1)).toEqual([]);
|
||||||
|
expect(angular.Array.limitTo(undefined, 1)).toEqual([]);
|
||||||
|
expect(angular.Array.limitTo({}, 1)).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should return a copy of input array if X is exceeds array length', function () {
|
||||||
|
expect(angular.Array.limitTo(items, 19)).toEqual(items);
|
||||||
|
expect(angular.Array.limitTo(items, '9')).toEqual(items);
|
||||||
|
expect(angular.Array.limitTo(items, -9)).toEqual(items);
|
||||||
|
expect(angular.Array.limitTo(items, '-9')).toEqual(items);
|
||||||
|
|
||||||
|
expect(angular.Array.limitTo(items, 9)).not.toBe(items);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue