Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.09.2020, 15:47
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Как найти большее и меньшее число от текущего в массиве?
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));

Но это не работает как нужно: возвращяется просто самое большее и меньшее в массиве.
Ответить с цитированием
  #2 (permalink)  
Старый 22.09.2020, 16:05
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

дай определение для "самое большее от N" и для меньшего тоже
Ответить с цитированием
  #3 (permalink)  
Старый 22.09.2020, 16:13
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Сообщение от Alexandroppolus Посмотреть сообщение
дай определение для "самое большее от N" и для меньшего тоже
Зачем? Мне не нужно самое большее/меньшее от N. Мне нужно следующее и предыдущее от N.
Ответить с цитированием
  #4 (permalink)  
Старый 22.09.2020, 16:13
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

отсортировать
получить текущий индекс
вычеслить индекс справа и слева
Ответить с цитированием
  #5 (permalink)  
Старый 22.09.2020, 16:14
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от CryNet
Зачем?
например, чтобы было понятно, что требуется сделать
Ответить с цитированием
  #6 (permalink)  
Старый 22.09.2020, 16:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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]);
Ответить с цитированием
  #7 (permalink)  
Старый 22.09.2020, 16:22
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Сообщение от 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)
Ответить с цитированием
  #8 (permalink)  
Старый 22.09.2020, 16:30
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

а массив отсортированный? или только в примере так?
Ответить с цитированием
  #9 (permalink)  
Старый 22.09.2020, 16:44
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

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


Сообщение от voraa Посмотреть сообщение
Вроде правильно работает
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() применил не там где нужно, и логика работала не правильно.

Всем спасибо.
Ответить с цитированием
  #10 (permalink)  
Старый 22.09.2020, 19:01
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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];
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти node элемент по позиции в html документе и обратоно meded90 Общие вопросы Javascript 0 06.09.2014 22:45
Как разбить input на заданное число ячеек как в кроссворде? javascript_pupil (X)HTML/CSS 2 20.08.2014 10:28
Как найти конец плоского файла Don_001 Общие вопросы Javascript 1 07.07.2009 12:47
как найти нужный объект? `p r o x y jQuery 2 05.05.2009 01:12
Как найти путь к файлу для модификации? JuliaMilan Firefox/Mozilla 0 31.03.2009 14:06