Как объединить две функции в одну?

Доброго времени суток, уважаемые!
Как можно объединить две одинаковых функции для поиска строк в таблице?
Первая (по input)
$('#search_table').keyup(function(){
		let search = this;
		$('#tabname tbody tr').find('input[name^=name]').each(function() {
			if($(this).val().toLowerCase().indexOf($(search).val().toLowerCase()) === -1) {
				$(this).closest('tr').hide();
			}
			else {
				$(this).closest('tr').show();   
			}  
		});
	});

Вторая (по атрибуту)
$('#search_card').keyup(function(){
		let search = this;
		$('#tabname tbody tr').find('[data-item-name="name"]').each(function() {
			if($(this).text().toLowerCase().indexOf($(search).val().toLowerCase()) === -1) {
				$(this).closest('tr').hide();
			}
			else {
				$(this).closest('tr').show();   
			}  
		});
	});

Смысл у них абсолютно одинаков - найти строки с задаваемым в поиске значением и вернуть результат, убрав остальное. Разница лишь в том, что первая ищет в значениях поля input[name^=name], а вторая в тексте элемента с атрибутом [data-item-name="name"].
Вот никак не могу сообразить, как их объединить, прописав условие если $(this).val() или $(this).text()
Помогите, плиз!
  • Вопрос задан
  • 159 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Тут 6 параметров – две группы по 3:
  1. кого слушаем #search_table VS #search_card
  2. что ищем input[name^=name] VS [data-item-name="name"]
  3. и с чем сравниваем val() VS text()


Вытащить всё в параметры:
const addFilter = (listenSelector, findSelector, methodName) => {
  $(listenSelector).keyup(function search() {
    const search = this;
    const searchValue = $(search).val().toLowerCase();

    $("#tabname tbody tr")
      .find(findSelector)
      .each(function () {
        const currentValue = $(this)[methodName]().toLowerCase();
        $(this).closest("tr").toggle(currentValue.includes(searchValue));
      });
  });
};

addFilter('#search_table', 'input[name^=name]', 'val');
addFilter('#search_card', '[data-item-name="name"]', 'text');
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
const searchOptions = [
  [ '#search_table', tr => $('input[name^=name]', tr).val() ],
  [ '#search_card', tr => $('[data-item-name="name"]', tr).text() ]
];

$(searchOptions.map(n => n[0]).join(', ')).on('input', () => {
  const values = searchOptions.map(n => $(n[0]).val().toLowerCase());

  $('#tabname tbody tr')
    .hide()
    .filter((i, n) => searchOptions.every((m, j) => m[1](n).toLowerCase().includes(values[j])))
    .show();
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Twstd
@Twstd
Разрабатываю приложения и микросервисы на Nodejs
То что ищем передавать в параметрах функции.
Написал самый простой вариант, если параметров много, то можно дописать функцию и сразу передавать массив параметров

$('#search_card').keyup(function(){
    let search = this;
showAndHide ('[data-item-name="name"]');
showAndHide ('input[name^=name]');
function showAndHide (param) {
    $('#tabname tbody tr').find(param).each(function() {
      if($(this).text().toLowerCase().indexOf($(search).val().toLowerCase()) === -1) {
        $(this).closest('tr').hide();
      }
      else {
        $(this).closest('tr').show();   
      }  
    });
  });
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы