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];
}

Alexandroppolus 22.09.2020 19:25

если массив отсортирован, можно вообще бинарным поиском

Лоэнрон 25.09.2020 01:00

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

рони 25.09.2020 09:46

Лоэнрон,
строка 2.
Цитата:

Порядок cортировки по умолчанию соответствует порядку кодовых точек Unicode.
для сортировки чисел необходимо указать функцию сортировки.
arr.sort((a,b) => a - b);

атрибут run сделает ваш код запускаемым
например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.


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