Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как найти большее и меньшее число от текущего в массиве? (https://javascript.ru/forum/misc/81058-kak-najjti-bolshee-i-menshee-chislo-ot-tekushhego-v-massive.html)

CryNet 22.09.2020 15:47

Как найти большее и меньшее число от текущего в массиве?
 
const currentData   = 5.09 // текущее число
const allDataMonth = [1.01, 1.01, 2.2, 5.07, 5.1, 9.9] // массив, в котором нужно найти большее и меньшее число от currentData


По идее должно вернуться 5.07 как меньшее от currentData и 5.1 как большее от currentData.

Пробую так:
const closestRight = Math.min(...allDataMonth.filter(v => v > currentData));
const closestLeft =  Math.max(...allDataMonth.filter(v => v < currentData));

Но это не работает как нужно: возвращяется просто самое большее и меньшее в массиве.

Alexandroppolus 22.09.2020 16:05

дай определение для "самое большее от N" и для меньшего тоже

CryNet 22.09.2020 16:13

Цитата:

Сообщение от Alexandroppolus (Сообщение 529134)
дай определение для "самое большее от N" и для меньшего тоже

Зачем? :-? Мне не нужно самое большее/меньшее от N. Мне нужно следующее и предыдущее от N.

Vlasenko Fedor 22.09.2020 16:13

отсортировать
получить текущий индекс
вычеслить индекс справа и слева

Alexandroppolus 22.09.2020 16:14

Цитата:

Сообщение от CryNet
Зачем?

например, чтобы было понятно, что требуется сделать

рони 22.09.2020 16:17

CryNet,
const currentData   = 5.09 // текущее число
const allDataMonth = [1.01, 1.01, 2.2, 5.07, 5.1, 9.9] // массив, в котором нужно найти большее и меньшее число от currentData

const closestRight = allDataMonth.find(v => v > currentData);
const closestLeft =  [...allDataMonth].reverse().find(v => v < currentData);
alert([closestLeft,closestRight]);

voraa 22.09.2020 16:22

Цитата:

Сообщение от CryNet
Но это не работает как нужно: возвращяется просто самое большее и меньшее в массиве.

Вроде правильно работает
const currentData   = 5.09 
const allDataMonth = [1.01, 1.01, 2.2, 5.07, 5.1, 9.9] 
const closestRight = Math.min(...allDataMonth.filter(v => v > currentData));
const closestLeft =  Math.max(...allDataMonth.filter(v => v < currentData));
alert(closestLeft+' '+closestRight)

Alexandroppolus 22.09.2020 16:30

а массив отсортированный? или только в примере так?

CryNet 22.09.2020 16:44

Цитата:

Сообщение от Alexandroppolus (Сообщение 529140)
а массив отсортированный? или только в примере так?

Числа берутся из куска HTML-я, а там они по порядку. Но на JS они не сортированы. Но дело оказалось в другом...


Цитата:

Сообщение от voraa (Сообщение 529139)
Вроде правильно работает
const currentData   = 5.09 
const allDataMonth = [1.01, 1.01, 2.2, 5.07, 5.1, 9.9] 
const closestRight = Math.min(...allDataMonth.filter(v => v > currentData));
const closestLeft =  Math.max(...allDataMonth.filter(v => v < currentData));
alert(closestLeft+' '+closestRight)

Да, всё правильно работает... Оказывается я parseInt() применил не там где нужно, и логика работала не правильно.

Всем спасибо.

laimas 22.09.2020 19:01

Здесь достаточного одного прохода простого цикла:

let left = right =  null;

for(let i=0; i<allDataMonth.length; ++ i) {
    if(allDataMonth[i] < currentData && (left==null || left < allDataMonth[i])) left = allDataMonth[i];
    if(allDataMonth[i] > currentData && (right==null || right > allDataMonth[i])) right = allDataMonth[i];
}


Часовой пояс GMT +3, время: 22:24.