Ответ Нины Шольц неверен.Ее функция нормализации возвращает 0.4
вместо 0.2
для значения 20
:
function normalize(min, max, bands, n) {
return n === max
? 1
: Math.floor(1 + ((n - min) / (max - min)) * bands) / bands;
}
console.log(normalize(0, 100, 5, 20)); // expected 0.2, actual 0.4
Поскольку 20
находится в первой полосе, оно должно иметь значение 0.2
:
i: 0 --> [0 - 20] --> 0.2
i: 1 --> [21 - 40] --> 0.4
i: 2 --> [41 - 60] --> 0.6
i: 3 --> [61 - 80] --> 0.8
i: 4 --> [81 - 100] --> 1
Правильный ответ:
const index = (min, max, bands, n) =>
Math.floor(bands * (n - min) / (max - min + 1));
const band = n => index(0, 100, 5, n);
console.log(band(0), band(20)); // 0 0
console.log(band(21), band(40)); // 1 1
console.log(band(41), band(60)); // 2 2
console.log(band(61), band(80)); // 3 3
console.log(band(81), band(100)); // 4 4
Как видите, граничные случаи обрабатываются правильно.Как мы дошли до этого ответа?
- Сначала мы найдем длину диапазона, равную
max - min + 1
.Значение + 1
важно, поскольку в диапазоне [0 - 100]
включительно 101 элемент. - Далее мы получаем индекс числа
n
в данном диапазоне (т. Е. n - min
). - Затем мы делим индекс
n
на количество элементов в диапазоне, чтобы получить значение в диапазоне [0 - 1)
.Обратите внимание, что 1
не находится в диапазоне. - Наконец, мы умножаем это значение на количество полос и отбрасываем дробную часть.Результатом является наш индекс.
Обратите внимание, что если длина диапазона не делится на количество полос, то первые x
полосы будут иметь один дополнительный элемент, где x
- этоостаток от деления длины диапазона на количество полос.
Наконец, мы можем получить желаемое значение, увеличив результирующий индекс, а затем разделив его на количество полос:
const index = (min, max, bands, n) =>
Math.floor(bands * (n - min) / (max - min + 1));
const value = (min, max, bands, n) =>
(index(min, max, bands, n) + 1) / bands;
const result = n => value(0, 100, 5, n);
console.log(result(0), result(20)); // 0.2 0.2
console.log(result(21), result(40)); // 0.4 0.4
console.log(result(41), result(60)); // 0.6 0.6
console.log(result(61), result(80)); // 0.8 0.8
console.log(result(81), result(100)); // 1 1
Надеюсь, это поможет.