Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 48c02f3

Browse files
committed
feat(limitTo): add support for array-likes
- Add support for array-like objects
1 parent cfc8b41 commit 48c02f3

File tree

2 files changed

+84
-11
lines changed

2 files changed

+84
-11
lines changed

src/ng/filter/limitTo.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -108,19 +108,25 @@ function limitToFilter() {
108108
if (isNaN(limit)) return input;
109109

110110
if (isNumber(input)) input = input.toString();
111-
if (!isArray(input) && !isString(input)) return input;
111+
if (!isArrayLike(input)) return input;
112112

113113
begin = (!begin || isNaN(begin)) ? 0 : toInt(begin);
114114
begin = (begin < 0) ? Math.max(0, input.length + begin) : begin;
115115

116116
if (limit >= 0) {
117-
return input.slice(begin, begin + limit);
117+
return sliceFn(input, begin, begin + limit);
118118
} else {
119119
if (begin === 0) {
120-
return input.slice(limit, input.length);
120+
return sliceFn(input, limit, input.length);
121121
} else {
122-
return input.slice(Math.max(0, begin + limit), begin);
122+
return sliceFn(input, Math.max(0, begin + limit), begin);
123123
}
124124
}
125125
};
126126
}
127+
128+
function sliceFn(input, begin, end) {
129+
if (isString(input)) return input.slice(begin, end);
130+
131+
return slice.call(input, begin, end);
132+
}

test/ng/filter/limitToSpec.js

+74-7
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,26 @@ describe('Filter: limitTo', function() {
44
var items;
55
var str;
66
var number;
7+
var arrayLike;
78
var limitTo;
89

910
beforeEach(inject(function($filter) {
1011
items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
1112
str = "tuvwxyz";
1213
number = 100.045;
14+
arrayLike = {
15+
0: 'a',
16+
1: 'b',
17+
2: 'c',
18+
3: 'd',
19+
4: 'e',
20+
5: 'f',
21+
6: 'g',
22+
7: 'h',
23+
get length() {
24+
return Object.keys(this).length - 1;
25+
}
26+
};
1327
limitTo = $filter('limitTo');
1428
}));
1529

@@ -21,20 +35,26 @@ describe('Filter: limitTo', function() {
2135
expect(limitTo(str, '3')).toEqual("tuv");
2236
expect(limitTo(number, 3)).toEqual("100");
2337
expect(limitTo(number, '3')).toEqual("100");
38+
expect(limitTo(arrayLike, 3)).toEqual(['a', 'b', 'c']);
39+
expect(limitTo(arrayLike, '3')).toEqual(['a', 'b', 'c']);
2440
});
2541

2642
it('should return the first X items beginning from index Y when X and Y are positive', function() {
2743
expect(limitTo(items, 3, '3')).toEqual(['d', 'e', 'f']);
2844
expect(limitTo(items, '3', 3)).toEqual(['d', 'e', 'f']);
2945
expect(limitTo(str, 3, 3)).toEqual("wxy");
3046
expect(limitTo(str, '3', '3')).toEqual("wxy");
47+
expect(limitTo(arrayLike, 3, 3)).toEqual(['d', 'e', 'f']);
48+
expect(limitTo(arrayLike, '3', '3')).toEqual(['d', 'e', 'f']);
3149
});
3250

3351
it('should return the first X items beginning from index Y when X is positive and Y is negative', function() {
3452
expect(limitTo(items, 3, '-3')).toEqual(['f', 'g', 'h']);
3553
expect(limitTo(items, '3', -3)).toEqual(['f', 'g', 'h']);
3654
expect(limitTo(str, 3, -3)).toEqual("xyz");
3755
expect(limitTo(str, '3', '-3')).toEqual("xyz");
56+
expect(limitTo(arrayLike, 3, '-3')).toEqual(['f', 'g', 'h']);
57+
expect(limitTo(arrayLike, '3', -3)).toEqual(['f', 'g', 'h']);
3858
});
3959

4060
it('should return the last X items when X is negative', function() {
@@ -44,33 +64,46 @@ describe('Filter: limitTo', function() {
4464
expect(limitTo(str, '-3')).toEqual("xyz");
4565
expect(limitTo(number, -3)).toEqual("045");
4666
expect(limitTo(number, '-3')).toEqual("045");
67+
expect(limitTo(arrayLike, -3)).toEqual(['f', 'g', 'h']);
68+
expect(limitTo(arrayLike, '-3')).toEqual(['f', 'g', 'h']);
4769
});
4870

4971
it('should return the last X items until index Y when X and Y are negative', function() {
5072
expect(limitTo(items, -3, '-3')).toEqual(['c', 'd', 'e']);
5173
expect(limitTo(items, '-3', -3)).toEqual(['c', 'd', 'e']);
5274
expect(limitTo(str, -3, -3)).toEqual("uvw");
5375
expect(limitTo(str, '-3', '-3')).toEqual("uvw");
76+
expect(limitTo(arrayLike, -3, '-3')).toEqual(['c', 'd', 'e']);
77+
expect(limitTo(arrayLike, '-3', -3)).toEqual(['c', 'd', 'e']);
5478
});
5579

5680
it('should return the last X items until index Y when X is negative and Y is positive', function() {
5781
expect(limitTo(items, -3, '4')).toEqual(['b', 'c', 'd']);
5882
expect(limitTo(items, '-3', 4)).toEqual(['b', 'c', 'd']);
5983
expect(limitTo(str, -3, 4)).toEqual("uvw");
6084
expect(limitTo(str, '-3', '4')).toEqual("uvw");
85+
expect(limitTo(arrayLike, -3, '4')).toEqual(['b', 'c', 'd']);
86+
expect(limitTo(arrayLike, '-3', 4)).toEqual(['b', 'c', 'd']);
6187
});
6288

6389
it('should return an empty array when X = 0', function() {
6490
expect(limitTo(items, 0)).toEqual([]);
6591
expect(limitTo(items, '0')).toEqual([]);
92+
expect(limitTo(arrayLike, 0)).toEqual([]);
93+
expect(limitTo(arrayLike, '0')).toEqual([]);
6694
});
6795

6896
it('should return entire array when X cannot be parsed', function() {
69-
expect(limitTo(items, 'bogus')).toEqual(items);
70-
expect(limitTo(items, 'null')).toEqual(items);
71-
expect(limitTo(items, 'undefined')).toEqual(items);
72-
expect(limitTo(items, null)).toEqual(items);
73-
expect(limitTo(items, undefined)).toEqual(items);
97+
expect(limitTo(items, 'bogus')).toBe(items);
98+
expect(limitTo(items, 'null')).toBe(items);
99+
expect(limitTo(items, 'undefined')).toBe(items);
100+
expect(limitTo(items, null)).toBe(items);
101+
expect(limitTo(items, undefined)).toBe(items);
102+
expect(limitTo(arrayLike, 'bogus')).toBe(arrayLike);
103+
expect(limitTo(arrayLike, 'null')).toBe(arrayLike);
104+
expect(limitTo(arrayLike, 'undefined')).toBe(arrayLike);
105+
expect(limitTo(arrayLike, null)).toBe(arrayLike);
106+
expect(limitTo(arrayLike, undefined)).toBe(arrayLike);
74107
});
75108

76109
it('should return an empty string when X = 0', function() {
@@ -97,12 +130,16 @@ describe('Filter: limitTo', function() {
97130
expect(limitTo(str, '3', 'undefined')).toEqual(limitTo(str, '3'));
98131
expect(limitTo(str, '-3', null)).toEqual(limitTo(str, '-3', 0));
99132
expect(limitTo(str, 3, undefined)).toEqual(limitTo(str, 3));
133+
expect(limitTo(arrayLike, 3, 'bogus')).toEqual(limitTo(arrayLike, 3, 0));
134+
expect(limitTo(arrayLike, -3, 'null')).toEqual(limitTo(arrayLike, -3));
135+
expect(limitTo(arrayLike, '3', 'undefined')).toEqual(limitTo(arrayLike, '3', 0));
136+
expect(limitTo(arrayLike, '-3', null)).toEqual(limitTo(arrayLike, '-3'));
137+
expect(limitTo(arrayLike, 3, undefined)).toEqual(limitTo(arrayLike, 3, 0));
100138
});
101139

102-
it('should return input if not String or Array or Number', function() {
140+
it('should return input if not array-like or Number', function() {
103141
expect(limitTo(null, 1)).toEqual(null);
104142
expect(limitTo(undefined, 1)).toEqual(undefined);
105-
expect(limitTo({}, 1)).toEqual({});
106143
});
107144

108145

@@ -111,8 +148,13 @@ describe('Filter: limitTo', function() {
111148
expect(limitTo(items, '9')).toEqual(items);
112149
expect(limitTo(items, -9)).toEqual(items);
113150
expect(limitTo(items, '-9')).toEqual(items);
151+
expect(limitTo(arrayLike, 9)).toEqual(items);
152+
expect(limitTo(arrayLike, '9')).toEqual(items);
153+
expect(limitTo(arrayLike, -9)).toEqual(items);
154+
expect(limitTo(arrayLike, '-9')).toEqual(items);
114155

115156
expect(limitTo(items, 9)).not.toBe(items);
157+
expect(limitTo(arrayLike, 9)).not.toBe(arrayLike);
116158
});
117159

118160
it('should return the entire string if X exceeds input length', function() {
@@ -129,6 +171,10 @@ describe('Filter: limitTo', function() {
129171
expect(limitTo(items, 'Infinity')).toEqual(items);
130172
expect(limitTo(items, -Infinity)).toEqual(items);
131173
expect(limitTo(items, '-Infinity')).toEqual(items);
174+
expect(limitTo(arrayLike, Infinity)).toEqual(items);
175+
expect(limitTo(arrayLike, 'Infinity')).toEqual(items);
176+
expect(limitTo(arrayLike, -Infinity)).toEqual(items);
177+
expect(limitTo(arrayLike, '-Infinity')).toEqual(items);
132178
});
133179

134180
it('should return the entire string when limited by Infinity', function() {
@@ -141,6 +187,8 @@ describe('Filter: limitTo', function() {
141187
it('should return an empty array if Y exceeds input length', function() {
142188
expect(limitTo(items, '3', 12)).toEqual([]);
143189
expect(limitTo(items, -3, '12')).toEqual([]);
190+
expect(limitTo(arrayLike, '3', 12)).toEqual([]);
191+
expect(limitTo(arrayLike, -3, '12')).toEqual([]);
144192
});
145193

146194
it('should return an empty string if Y exceeds input length', function() {
@@ -153,19 +201,38 @@ describe('Filter: limitTo', function() {
153201
expect(limitTo(items, '-4', -12)).toEqual(['e', 'f', 'g', 'h']);
154202
expect(limitTo(str, 4, '-12')).toEqual("tuvw");
155203
expect(limitTo(str, '-4', -12)).toEqual("wxyz");
204+
expect(limitTo(arrayLike, 4, '-12')).toEqual(['a', 'b', 'c', 'd']);
205+
expect(limitTo(arrayLike, '-4', -12)).toEqual(['e', 'f', 'g', 'h']);
156206
});
157207

158208
it('should return the entire string beginning from Y if X is positive and X+Y exceeds input length', function() {
159209
expect(limitTo(items, 7, 3)).toEqual(['d', 'e', 'f', 'g', 'h']);
160210
expect(limitTo(items, 7, -3)).toEqual(['f', 'g', 'h']);
161211
expect(limitTo(str, 6, 3)).toEqual("wxyz");
162212
expect(limitTo(str, 6, -3)).toEqual("xyz");
213+
expect(limitTo(arrayLike, 7, 3)).toEqual(['d', 'e', 'f', 'g', 'h']);
214+
expect(limitTo(arrayLike, 7, -3)).toEqual(['f', 'g', 'h']);
163215
});
164216

165217
it('should return the entire string until index Y if X is negative and X+Y exceeds input length', function() {
166218
expect(limitTo(items, -7, 3)).toEqual(['a', 'b', 'c']);
167219
expect(limitTo(items, -7, -3)).toEqual(['a', 'b', 'c', 'd', 'e']);
168220
expect(limitTo(str, -6, 3)).toEqual("tuv");
169221
expect(limitTo(str, -6, -3)).toEqual("tuvw");
222+
expect(limitTo(arrayLike, -7, 3)).toEqual(['a', 'b', 'c']);
223+
expect(limitTo(arrayLike, -7, -3)).toEqual(['a', 'b', 'c', 'd', 'e']);
224+
});
225+
226+
it('should not throw an error if used with an array like object', function() {
227+
function getArguments() {
228+
return arguments;
229+
}
230+
var argsObj = getArguments({name: 'Misko'}, {name: 'Igor'}, {name: 'Brad'});
231+
232+
var nodeList = jqLite("<p><span>Misko</span><span>Igor</span><span>Brad</span></p>")[0].childNodes;
233+
234+
expect(limitTo(argsObj, 2).length).toBe(2);
235+
expect(limitTo('abc', 1).length).toBe(1);
236+
expect(limitTo(nodeList, 3).length).toBe(3);
170237
});
171238
});

0 commit comments

Comments
 (0)