Javascript 为非相邻关键字选择2个自定义匹配器

Javascript 为非相邻关键字选择2个自定义匹配器,javascript,jquery-select2,Javascript,Jquery Select2,我在我的应用程序中使用它来搜索一个包含1200个选项的下拉列表 我目前正在使用Select2的matcher的默认实现,只要关键字在搜索结果中相邻,它就可以正常工作: function(term, text) { return text.toUpperCase().indexOf(term.toUpperCase())>=0; } 例如,搜索“stackoverflow question”会返回选项“stackoverflow question about Select2” 然而,我希望

我在我的应用程序中使用它来搜索一个包含1200个选项的下拉列表

我目前正在使用Select2的matcher的默认实现,只要关键字在搜索结果中相邻,它就可以正常工作:

function(term, text) { return text.toUpperCase().indexOf(term.toUpperCase())>=0; }
例如,搜索“stackoverflow question”会返回选项“stackoverflow question about Select2”

然而,我希望匹配器返回基于非相邻关键字的结果。例如,我还希望它在搜索“stackoverflow select2”时返回上述选项

有人知道如何创建一个自定义匹配器来允许这种行为吗?

试试这个:

搜索堆栈溢出问题堆栈溢出选择2选择2堆栈溢出关于堆栈溢出选择2问题问题选择2关于

<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>

关于Select2的Stackoverflow问题
另一行。。。
抄袭自:

函数置换(输入、置换、使用置换){
varⅠ,ch;
对于(i=0;i
这就是我在Select2 4中所做的。 我希望matcher只返回包含所有输入关键字的选项(假设关键字是由“”分割的搜索词)。匹配是不区分大小写的

        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;
            }
matcher:函数(参数、数据){
//如果没有搜索词,则返回所有数据
如果($.trim(参数术语)=''){
返回数据;
}
//`params.term`应该是用于搜索的术语
//按“”拆分以获取关键字
关键词=(参数项).split(“”);
//`data.text`是为数据对象显示的文本
//检查data.text是否包含所有关键字,如果缺少某些关键字,则返回null
对于(var i=0;i

我知道这是一个老话题,但也许有人会觉得这很有用。

如果您有大量数据或嵌套数据,那么排列将花费大量时间

请尝试使用非相邻关键字进行搜索

只需将此函数放入文档中即可。初始化前请准备好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();

});
$(函数(){
var关键词;
$.fn.select2.defaults=$.extend($.fn.select2.defaults,{
占位符:“选择…”,
匹配器:函数(术语、文本、选项){
如果($.trim(术语)=''){
返回true;
}             
关键词=(术语).split(“”);
对于(var i=0;i

工作示例如下:

查找全部或部分命令词:

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;
         }
});
element.select2({
匹配器:函数(术语、文本){
if(term.length<3){return true}
var术语=术语拆分(“”);
var计数=0;
var nbterm=术语长度;
就(i)而言{
if(text.toUpperCase().match(新的RegExp(terms[i],“i”)){count++}
如果(nbterm==计数){
返回true;
}
}
返回false;
}
});

谢谢!当关键字在选项中的显示顺序与关键字在选项中的显示顺序相同时,这就像一个符咒。例如,在搜索“Stackoverflow Select2”时,它确实会返回“Stackoverflow question about Select2”。但是,在搜索“select2 stackoverflow”时,它不会返回此值。你知道如何做到这一点吗?@AV86NL你真正想要的不是我实现的。您的搜索应该总是从左到右开始,而不是从左到右。要查找有关选择2的Stackoverflow问题,您可以搜索:Stackoverflow问题、关于问题、选择问题2,但不能从右向左搜索(选择2关于、关于Stackoverflow)。为此,您必须更改选项单词的顺序(从Stackoverflow问题关于Select2到Select2关于问题Stackoverflow),然后再次搜索。。。你明白我的意思吗?谢谢你的解释。不幸的是,我无法更改选项内容的顺序,因为所有选项都是固定的产品描述。我试图允许最终用户搜索这些描述中的术语(无论它们在描述中位于何处),并仅返回产品描述中包含所有术语的选项。这可能吗
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;
         }
});