【问题标题】:jQuery Autocomplete to find exact matchjQuery Autocomplete 查找完全匹配
【发布时间】:2016-07-01 16:21:26
【问题描述】:

我有一个用于机场的 jQuery Autocomplete。我的数据集包含标签和值。 示例:

var Airports = [
    { "label": "DMB - Dzhambyl, Dzhambyl Airport", "value": "DMB" }, 
    { "label": "EMA - Nottingham, Nottingham East Midlands Airport", "value": "EMA" }, 
    { "label": "HAM - Hamburg, Hamburg Airport", "value": "HAM" }    
];

当我进入 HAM(汉堡机场的 3LC)时,我目前得到了所有这三个项目。但如果此项的值与确切的搜索请求匹配,我只想查看“HAM - 汉堡,汉堡机场”。还应该可以找到所有条目,例如“burg” 如果我要搜索的话。

演示:https://jsfiddle.net/SchweizerSchoggi/pguoa197/1/

【问题讨论】:

  • 在 jQuery Autocomplete API 文档api.jqueryui.com/autocomplete 中有一个示例显示如何从文本的开头进行匹配。
  • 是的,但两者都应该是可能的。如果我使用“从文本开头搜索”,我会找到 HAM-Hamburg,但如果我要搜索的话,文本中间没有带有“burg”的条目
  • 所以如果它是精确命中,你想匹配值,否则匹配文本?在这种情况下,修改源函数以提供该行为。
  • 这正是我想要的。但是,如果我知道该怎么做,我就会这样做:-(
  • 我什至不想写它。我很想拒绝将其作为一项要求,因为与将来维护该搜索功能的成本相比,这对我来说价值微乎其微。

标签: jquery jquery-ui autocomplete


【解决方案1】:

从您的问题描述看来,您只想从值字符串的开头进行匹配。在这种情况下,您可以为自动完成创建自己的过滤方法,如下所示:

$.ui.autocomplete.filter = function (array, term) {
    var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term), "i");
    return $.grep(array, function (value) {
        return matcher.test(value.label || value.value || value);
    });
};

Updated fiddle

【讨论】:

  • 谢谢罗里,对于汉堡(火腿)来说,这很好用。但也应该可以找到例如“诺丁汉”。现在已经不是这样了
  • 恐怕是其中之一。 ham 是两个字符串的有效部分,因此会在搜索时显示。
【解决方案2】:

不知道谁否决了这个问题以及为什么...但对于将来需要类似问题的人来说,这是解决方案:

$(function () {
    var Airports = [
        { "label": "DMB - Dzhambyl, Dzhambyl Airport", "value": "DMB" }, 
        { "label": "EMA - Nottingham, Nottingham East Midlands Airport", "value": "EMA" }, 
        { "label": "HAM - Hamburg, Hamburg Airport", "value": "HAM" }    
    ];


$("#depart").autocomplete({
     source: function (request, response) {
        var term = $.ui.autocomplete.escapeRegex(request.term)
            , startsWithMatcher = new RegExp("^" + term, "i")
            , startsWith = $.grep(Airports, function(value) {
                return startsWithMatcher.test(value.label || value.value || value);
            })
            , containsMatcher = new RegExp(term, "i")
            , contains = $.grep(Airports, function (value) {
                return $.inArray(value, startsWith) < 0 && 
                    containsMatcher.test(value.label || value.value || value);
            });

            response(startsWith.concat(contains));
    },
    minLength: 3
  });
});

工作样本:https://jsfiddle.net/SchweizerSchoggi/pguoa197/5/

【讨论】:

  • 我看不出这是如何解决的,因为它显示的结果与问题中的代码完全相同。如果您只想在列表中将HAM 向上移动,您可以指定自定义排序。
  • 不一样。当您进入 HAM 时,Hamburg 现在首先出现(匹配 3LC),然后是其余的。在最初的样本中,汉堡仅在 pos 3 上
  • 在这种情况下,您只需要实现自定义排序。您的问题意味着您只想过滤第一个字符 - But I only want to see "HAM - Hamburg, Hamburg Airport" if the value of this item matches the exact search request
猜你喜欢
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2014-05-07
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多