1 |
|
2 | const 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 |
|
41 | export 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 |
|
50 | export 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 |
|
63 | export 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 | }
|