Функция для возврата значения из массива на основе ввода

У меня есть массив со значениями

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])

Переменные должны быть объявлены с помощью const или let.

Pointy 19.11.2022 15:58
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Хук useOnClickOutside в ReactJS
Хук useOnClickOutside в ReactJS
Как разработчик ReactJS, вы, возможно, сталкивались с ситуацией, когда вам нужно закрыть модальное или выпадающее меню, когда кто-то щелкает за его...
Хуки (часть-2) - useEffect
Хуки (часть-2) - useEffect
Хук useEffect - один из самых мощных и универсальных инструментов в арсенале разработчика React. Он позволяет вам управлять побочными эффектами в...
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
В предыдущем посте я показал вам на примерах, как писать базовые тесты в React. Важнейшей частью пользовательского интерфейса приложений является...
1
1
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно сравнить 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.

GarfieldKlon 22.11.2022 14:52

Ой, вы правы, нужен Math.max

CertainPerformance 22.11.2022 15:01
Ответ принят как подходящий

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]) , поэтому вы не получите желаемого результата.

Вам нужно немного изменить код.

Другие вопросы по теме