Хобрук: Ваш путь к мастерству в программировании

Пользовательское сопоставление Select2 для несмежных ключевых слов

Я использую Select2 в своем приложении, чтобы обеспечить поиск в раскрывающемся списке с примерно 1200 вариантами.

В настоящее время я использую реализацию сопоставления Select2 по умолчанию, которая работает хорошо, пока ключевые слова находятся рядом в результатах поиска:

function(term, text) { return text.toUpperCase().indexOf(term.toUpperCase())>=0; }

Например, поиск по запросу «вопрос stackoverflow» возвращает вариант «вопрос stackoverflow о Select2».

Однако я бы хотел, чтобы сопоставитель возвращал результаты на основе несмежных ключевых слов. Например, я также хотел бы, чтобы он возвращал указанный выше параметр при поиске «stackoverflow select2».

Кто-нибудь знает, как создать собственный сопоставитель, чтобы учесть такое поведение?


  • Обратите внимание, что теги не являются ключевыми словами. Наполнение списка тегов теми же словами, что и в вашем вопросе (поиск, ключевое слово, сопоставление), не поможет классифицировать его. Всегда обязательно читайте описания, которые появляются при выборе тегов! 28.07.2014
  • Спасибо за уведомление, Чарльз, сделаю это в следующих постах! 28.07.2014

Ответы:


1

Попробуй это:

поиск вопрос о stackoverflow, выбор stackoverflow2, выбор2 stackoverflow, о вопросе о stackoverflow select2, вопрос о select2 о< /сильный>

<select id="e17_2" style="width:300px">
   <option alt="Stackoverflow question about Select2">Stackoverflow question about Select2</option>
   <option alt="Stackoverflow Other line ...">Stackoverflow Other line ...</option>
</select>

Скопировано из: https://stackoverflow.com/a/21745151/3710490

function permute(input, permArr, usedChars) {
    var i, ch;
    for (i = 0; i < input.length; i++) {
        ch = input.splice(i, 1)[0];
        usedChars.push(ch);
        if (input.length == 0) {
            permArr.push(usedChars.slice());
        }
        permute(input, permArr, usedChars);
        input.splice(i, 0, ch);
        usedChars.pop();
    }
    return permArr
};


$("#e17_2").select2({
    matcher: function(term, text) { 

                if (term.length == 0) return true;
                texts = text.split(" ");

                allCombinations = permute(texts, [], []);

                for(i in allCombinations){
                    if( allCombinations[i].join(" ").toUpperCase().indexOf(term.toUpperCase())==0 ){
                        return true;
                    }
                }

                return false;

    }
});
27.07.2014
  • Спасибо! Это работает как шарм, когда ключевые слова находятся в том же порядке, что и порядок, в котором они появляются в параметрах. Например, это действительно возвращает «вопрос Stackoverflow о Select2» при поиске «стекпоток select2». Однако он не возвращает это при поиске «select2 stackoverflow». У вас есть идеи, как это сделать? 28.07.2014
  • @ AV86NL То, что вы на самом деле хотите, это не то, что я реализовал. Ваш поиск всегда должен начинаться слева направо, а не иначе. Чтобы найти вопрос Stackoverflow о Select2, вы можете выполнить поиск: вопрос Stackoverflow, вопрос о, вопрос о Select2, но никогда справа налево (выберите2 о, о Stackoverflow). Для этого вы должны изменить порядок слов вашего варианта (с вопрос Stackoverflow о Select2 на Select2 о вопросе Stackoverflow), а затем снова выполнить поиск... Вы получаете моя точка? 28.07.2014
  • Спасибо за объяснение. К сожалению, я не могу изменить порядок содержимого опций, так как все опции являются фиксированными описаниями продуктов. Я пытаюсь разрешить конечному пользователю искать термины в этих описаниях (независимо от того, где они расположены в описании) и возвращать только те варианты, для которых все термины включены в описание продукта. Возможно ли это вообще с Select2, или мне следует искать какое-то другое решение? Я пометил ваш ответ как принятый, поскольку вы полностью ответили на мой первоначальный вопрос. Спасибо! 28.07.2014
  • Вам не нужно менять свои параметры, только определите сопоставитель. Каковы именно ваши требования? Просто перечислите их, чтобы отменить/одобрить 28.07.2014
  • Обратный поиск теперь работает хорошо, спасибо. Единственным дополнительным требованием будет разрешить поиск по любому количеству ключевых слов. Текущее количество ключевых слов для поиска ограничено двумя :-) 28.07.2014

  • 2

    это то, что я сделал в Select2 4. Я хотел, чтобы сопоставитель возвращал только те параметры, которые содержат все введенные ключевые слова (при условии, что ключевые слова являются поисковым термином, разделенным «»). Сопоставление не зависит от регистра.

            matcher: function (params, data) {
                    // If there are no search terms, return all of the data
                    if ($.trim(params.term) === '') {
                        return data;
                    }
                    // `params.term` should be the term that is used for searching
                    // split by " " to get keywords
                    keywords=(params.term).split(" ");
                    // `data.text` is the text that is displayed for the data object
                    // check if data.text contains all of keywords, if some is missing, return null
                    for (var i = 0; i < keywords.length; i++) {
    
                        if (((data.text).toUpperCase()).indexOf((keywords[i]).toUpperCase()) == -1) 
                          // Return `null` if the term should not be displayed
                          return null;
    
                    }
                    // If here, data.text contains all keywords, so return it.
                    return data;
                }
    

    Я знаю, что это старая тема, но, возможно, кто-то найдет это полезным.

    25.07.2015

    3

    Если у вас большой объем данных или вложенные данные, то перестановка займет много времени.

    Вместо этого попробуйте это для поиска с использованием несмежных ключевых слов.

    Просто поместите эту функцию в свой document.ready перед инициализацией select2.

    $(function () { 
    
        var keywords;
    
        $.fn.select2.defaults = $.extend($.fn.select2.defaults, {            
            placeholder: 'Select...',            
            matcher: function(term, text, option) {
    
                if ($.trim(term) === '') {
                    return true;
                }             
                keywords = (term).split(" ");
    
                for (var i = 0; i < keywords.length; i++) {
    
                    if ((text.toUpperCase()).indexOf((keywords[i]).toUpperCase()) == -1 )                        
                    {                        
                        return false;
                    }                                         
                }                
                return true;  
            }
        });
    
      $("#DropdownID").select2();
    
    });
    

    Рабочий пример находится здесь: http://makmilan.blogspot.in/2015/11/select2-custom-matcher-for-non-adjacent.html

    06.10.2015

    4

    Найдите все или часть императивных слов:

    element.select2({
        matcher: function(term, text){
            if (term.length < 3) { return true }
            var terms = term.split(" ");
            var count = 0;
            var nbterm = terms.length;
    
            for(i in terms) {
                if (text.toUpperCase().match(new RegExp(terms[i], "i"))) { count++ }
                    if(nbterm == count){
                        return true;
                    }
                 }
                 return false;
             }
    });
    
    14.03.2016
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..


    © 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании