UNPKG

1.89 kBJavaScriptView Raw
1// Find closest index for a given value
2const closest = (array, n) => {
3 let minI = 0;
4 let maxI = array.length - 1;
5
6 if (array[minI] > n) {
7 return minI;
8 } else if (array[maxI] < n) {
9 return maxI;
10 } else if (array[minI] <= n && n <= array[maxI]) {
11 let closestIndex = null;
12
13 while (closestIndex === null) {
14 const midI = Math.round((minI + maxI) / 2);
15 const midVal = array[midI];
16
17 if (midVal === n) {
18 closestIndex = midI;
19 } else if (maxI === minI + 1) {
20 const minValue = array[minI];
21 const maxValue = array[maxI];
22 const deltaMin = Math.abs(minValue - n);
23 const deltaMax = Math.abs(maxValue - n);
24
25 closestIndex = deltaMax <= deltaMin ? maxI : minI;
26 } else if (midVal < n) {
27 minI = midI;
28 } else if (midVal > n) {
29 maxI = midI;
30 } else {
31 closestIndex = -1;
32 }
33 }
34
35 return closestIndex;
36 }
37
38 return -1;
39};
40
41export function valueToPosition(value, valuesArray, sliderLength) {
42 const index = closest(valuesArray, value);
43
44 const arrLength = valuesArray.length - 1;
45 const validIndex = index === -1 ? arrLength : index;
46
47 return (sliderLength * validIndex) / arrLength;
48}
49
50export function positionToValue(position, valuesArray, sliderLength) {
51 var arrLength;
52 var index;
53
54 if (position < 0 || sliderLength < position) {
55 return null;
56 } else {
57 arrLength = valuesArray.length - 1;
58 index = (arrLength * position) / sliderLength;
59 return valuesArray[Math.round(index)];
60 }
61}
62
63export function createArray(start, end, step) {
64 var i;
65 var length;
66 var direction = start - end > 0 ? -1 : 1;
67 var result = [];
68 if (!step) {
69 return result;
70 } else {
71 length = Math.abs((start - end) / step) + 1;
72 for (i = 0; i < length; i++) {
73 result.push(start + i * Math.abs(step) * direction);
74 }
75 return result;
76 }
77}