Javascript 为非相邻关键字选择2个自定义匹配器
我在我的应用程序中使用它来搜索一个包含1200个选项的下拉列表 我目前正在使用Select2的matcher的默认实现,只要关键字在搜索结果中相邻,它就可以正常工作: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” 然而,我希望
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;
}
});