У меня есть массив со значениями
const range = [1,10,100,500,1000,2000,4000,8000]
let input = 1580
Ожидаемый результат — 1000, потому что 1580 находится между 1000 и 2000.
Но мой код дает неправильные результаты, а также дает неверные значения для больших значений.
for(i=0;i<range.length;i++)
{
if (input > range[i])
break;
}
console.info(range[i])
Вам нужно сравнить input < range, чтобы найти первое, которое больше, чем input.
Затем, если вы можете ожидать, что массив будет отсортирован, вам нужно будет использовать значение перед индексом, на котором вы прерываетесь, потому что это после превышения предела.
const range = [1, 10, 100, 500, 1000, 2000, 4000, 8000]
const input = 1580
let i;
for (i = 0; i < range.length; i++) {
if (input < range[i])
break;
}
console.info(i);
console.info(range[i - 1])
Но лучшим подходом, который не зависит от сортируемого массива, было бы .reduce сохранить наибольшее найденное число, удовлетворяющее условию, в качестве аккумулятора.
const range = [1,1560,10,100,500,1000,1500,2000,4000,8000,1550];
const input = 1580;
const output = range.reduce(
(bestSoFar, num) => num > input ? bestSoFar : Math.max(bestSoFar, num),
0
);
console.info(output);
Уменьшение также зависит от заказа. Если массив диапазонов не отсортирован, сокращение просто даст вам последнее число, которое > введено. Протестируйте его с [1,1560,10,100,500,1000,1500,2000,4000,8000,1550], и он даст вам 1550, а не 1560.
Ой, вы правы, нужен Math.max
const range = [1,10,100,500,1000,2000,4000,8000]
let input = 1580
console.info(range.reduce((a,c)=>c<=input?c:a))
for(i=0;i<range.length;i++)
{
if (input > range[i])
break;
}
console.info(range[i]);
В строке №:3 логическое условие неверно, то, что вы фактически пытаетесь сделать, это проверить, больше ли ввод, чем каждое значение диапазона.
Ваш цикл разорвется на первом значении массива диапазонов (т.е. range[0]) , поэтому вы не получите желаемого результата.
Вам нужно немного изменить код.
Переменные должны быть объявлены с помощью const или let.