UNPKG

1.05 kBJavaScriptView Raw
1module.exports = function(arr, start, end, step) {
2
3 var len = arr.length;
4
5 if (step === 0) throw new Error("step cannot be zero");
6 step = step ? integer(step) : 1;
7
8 // normalize negative values
9 start = start < 0 ? len + start : start;
10 end = end < 0 ? len + end : end;
11
12 // default extents to extents
13 start = integer(start === 0 ? 0 : !start ? (step > 0 ? 0 : len - 1) : start);
14 end = integer(end === 0 ? 0 : !end ? (step > 0 ? len : -1) : end);
15
16 // clamp extents
17 start = step > 0 ? Math.max(0, start) : Math.min(len, start);
18 end = step > 0 ? Math.min(end, len) : Math.max(-1, end);
19
20 // return empty if extents are backwards
21 if (step > 0 && end <= start) return [];
22 if (step < 0 && start <= end) return [];
23
24 var result = [];
25
26 for (var i = start; i != end; i += step) {
27 if ((step < 0 && i <= end) || (step > 0 && i >= end)) break;
28 result.push(arr[i]);
29 }
30
31 return result;
32}
33
34function integer(val) {
35 return String(val).match(/^[0-9]+$/) ? parseInt(val) :
36 Number.isFinite(val) ? parseInt(val, 10) : 0;
37}