为什么是先行匹配期?

时间:2015-12-30 02:28:21

标签: javascript jquery typeahead.js

我使用了来自typeahead示例here的相同代码。但是,如果您输入句点.,则下拉列表会显示匹配项。所有这些代码都必须在数组定义之上吗?如果阵列中没有句点,是否有更简单的方法来完成相同的事情,即你不会得到句点匹配?

我看到它下面的猎犬示例完成了同样的事情并且不匹配句点但是它使用var states来定义一个数组然后使用var states构建一个新的猎犬引擎这是一个误?

从网站上复制代码:

var substringMatcher = function(strs) {
  return function findMatches(q, cb) {
    var matches, substringRegex;

    // an array that will be populated with substring matches
    matches = [];

    // regex used to determine if a string contains the substring `q`
    substrRegex = new RegExp(q, 'i');

    // iterate through the pool of strings and for any string that
    // contains the substring `q`, add it to the `matches` array
    $.each(strs, function(i, str) {
      if (substrRegex.test(str)) {
        matches.push(str);
      }
    });

    cb(matches);
  };
};

var states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California',
  'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii',
  'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana',
  'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota',
  'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',
  'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota',
  'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island',
  'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont',
  'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'
];

$('#the-basics .typeahead').typeahead({
  hint: true,
  highlight: true,
  minLength: 1
},
{
  name: 'states',
  source: substringMatcher(states)
});

就我而言,我正在生成一系列标签,而不是我正在使用的状态var tags = <%= raw Tag.all.pluck(:name) %>;

2 个答案:

答案 0 :(得分:1)

您可能会发现indexOf比应用程序的正则表达式更有用。

if (haystack.indexOf(needle) != -1) {
        /* needle is in haystack */
}

或不区分大小写:

if (haystack.toLowerCase().indexOf(needle.toLowerCase()) != -1) {
}

类似的东西:

function findMatches(q, cb) {
    var lq = q.toLowerCase();
    var matches = [];

    $.each(strs, function(i, str) {
        if (str.toLowerCase().indexOf(lq) != -1) matches.push(str);
    });

    cb(matches);
}

答案 1 :(得分:1)

因此正则表达式“复杂”,容易出错。 “”例如在正则表达式中具有特殊含义,它匹配除JS中的换行符之外的任何字符串,因此例如基于Mozilla的文档,RexExp(“。n”,“i”)将匹配“.n”,“an”,“in”,“ “还有更多。

正则表达式难以正确使用。

@ John-Hascall的建议很好地解决了这个问题。