Как найти большее и меньшее число от текущего в массиве?
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)); Но это не работает как нужно: возвращяется просто самое большее и меньшее в массиве. |
дай определение для "самое большее от N" и для меньшего тоже
|
Цитата:
|
отсортировать
получить текущий индекс вычеслить индекс справа и слева |
Цитата:
|
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]); |
Цитата:
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) |
а массив отсортированный? или только в примере так?
|
Цитата:
Цитата:
Всем спасибо. |
Здесь достаточного одного прохода простого цикла:
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]; } |
если массив отсортирован, можно вообще бинарным поиском
|
function getNum(arr, a){ arr.sort(); for(let i = 0; i < arr.length; i++){ if(arr[i] > a){ if(i == 0) return `${arr[i]}`; if( (arr[i] - a) > (arr[i-1] - a) ){ return `${arr[i-1]},${arr[i]}`; } else { return `${arr[i-1]},${arr[i-2]}`; } } else if (i == arr.length - 1){ return `${arr[i]}`; } } } let arr = [99,56,87,78,66,55]; console.log(getNum(arr, 88)); // 87,99 console.log(getNum(arr, 100)); // 99 console.log(getNum(arr, 10)); // 55 |
Лоэнрон,
строка 2. Цитата:
arr.sort((a,b) => a - b); атрибут run сделает ваш код запускаемым например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Часовой пояс GMT +3, время: 05:59. |