Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2018, 06:23   #1
spoon100500
Форумчанин
 
Аватар для spoon100500
 
Регистрация: 14.10.2016
Сообщений: 406
По умолчанию Получить ближайшее значение из массива

Здравствуйте, подскажите, есть массив x=[50,60,70,80,90,100] и y=[100,120,140,160,200,220], клиент в input Ширина и Высота вводит числа, например ширина=48, высота=112, нужно выбрать из массива x=50, y=120.
Как такое сделать?
Еду медленно, но верно!
spoon100500 вне форума Ответить с цитированием
Старый 06.08.2018, 11:07   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

перебором?

Код:
<head>
  <meta charset="utf-8">
</head>
<body>
<div>
x: <input type="text" id="x_input" value="50"><br>
</div>
<input type="button" id="button" name="button" value="Найти наиболее подходящее" >

<script>
	var x=[50,60,70,80,90,100];

	var but = document.getElementById('button');
	but.addEventListener('click',function(){

		var xf = +document.getElementById("x_input").value;
		var f_index = x.indexOf(xf); 
		if( f_index == -1){
			var diff=Math.abs(xf-x[0]);
			f_index=0;
			for(var i=1; i<x.length; i++) {
				if(Math.abs(xf-x[i])<diff){
					f_index=i;
					diff=Math.abs(xf-x[i]);
				}
			}
		}
		alert('x = '+x[f_index]);
	})
</script>
</body>
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.08.2018, 15:54   #3
spoon100500
Форумчанин
 
Аватар для spoon100500
 
Регистрация: 14.10.2016
Сообщений: 406
По умолчанию

Вот такой вариант предложили, вроде работает
Код:
        Array.prototype.nearest = function (i)
        {
            return this.filter(x => x >= i).sort((x, y) => Math.abs(x - i) - Math.abs(y - i))[0];
        }
 
        console.log([50, 60, 70, 80, 90, 100, 110].nearest(51), [100, 140, 160, 180, 200, 220].nearest(95));
Только не могу понять этот прототип как он работает, хрен знает
Еду медленно, но верно!

Последний раз редактировалось spoon100500; 06.08.2018 в 15:56.
spoon100500 вне форума Ответить с цитированием
Старый 06.08.2018, 16:07   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

как он работает, понятно.
вопрос в другом. он же находит не ближайшее, а ближайшее большее.
Хотя, скорее всего, Вам там и надо.
(у меня ищет ближайшее целое, которое может быть и меньше заданного).

вот, например, для 61 какой ответ должен быть?

Код:
console.log([50, 60, 70, 80, 90, 100, 110].nearest(61)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.08.2018, 16:19   #5
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
как он работает, понятно.
вопрос в другом. он же находит не ближайшее, а ближайшее большее.
Можно фильтр убрать и заработает также.

-----
Но я бы не гадил в прототип массива, не ведет это к добру.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 06.08.2018, 17:10   #6
spoon100500
Форумчанин
 
Аватар для spoon100500
 
Регистрация: 14.10.2016
Сообщений: 406
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
например, для 61 какой ответ должен быть?
должно быть 70
Еду медленно, но верно!
spoon100500 вне форума Ответить с цитированием
Старый 06.08.2018, 17:13   #7
spoon100500
Форумчанин
 
Аватар для spoon100500
 
Регистрация: 14.10.2016
Сообщений: 406
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
как он работает, понятно.
Что делает прототип?
Еду медленно, но верно!
spoon100500 вне форума Ответить с цитированием
Старый 06.08.2018, 17:34   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от spoon100500 Посмотреть сообщение
Что делает прототип?
добавляет новый метод nearest в класс Array
(см. Наследование в JS)


Цитата:
Сообщение от spoon100500 Посмотреть сообщение
должно быть 70
тогда всё правильно в данном коде в пост #3
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.08.2018, 17:47   #9
spoon100500
Форумчанин
 
Аватар для spoon100500
 
Регистрация: 14.10.2016
Сообщений: 406
По умолчанию

Спасибо. Почитал про этот прототип, посмотрел примеры реализации, блин крутетская штука) это можно 1000 шарикам задать разные значения и с минимальным кодом, не используем каждый раз new и this.
Еду медленно, но верно!

Последний раз редактировалось spoon100500; 06.08.2018 в 18:09.
spoon100500 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение столбца "За сутки" из массива значений соответсвующих определенной дате Pavel1980 Microsoft Office Excel 8 16.11.2014 20:25
Prolog.Ближайшее значение в списке Lisёноk Помощь студентам 2 28.11.2013 16:36
сравнить значение из массива и выбрать значение konrad Microsoft Office Excel 4 15.03.2011 20:40
Функция ВПР возвращает лишь 1 ближайшее к заданному значение...... Death Dealer Microsoft Office Excel 4 24.11.2008 11:26