Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/480.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么提前打印匹配周期?_Javascript_Jquery_Typeahead.js - Fatal编程技术网

Javascript 为什么提前打印匹配周期?

Javascript 为什么提前打印匹配周期?,javascript,jquery,typeahead.js,Javascript,Jquery,Typeahead.js,我使用的代码与typeahead示例中的代码相同。但是,如果键入句点,则下拉列表将显示匹配项。数组定义上面的所有代码都是必需的吗?如果数组中没有句点,就无法获得句点匹配,那么有没有更简单的方法来完成相同的任务 我看到下面的猎犬示例,它完成了相同的任务,并且不匹配周期,但它是否使用var states定义数组,然后使用var states构建新的猎犬引擎?这是错误的吗 从网站复制的代码: var substringMatcher = function(strs) { return functi

我使用的代码与typeahead示例中的代码相同。但是,如果键入句点
,则下拉列表将显示匹配项。数组定义上面的所有代码都是必需的吗?如果数组中没有句点,就无法获得句点匹配,那么有没有更简单的方法来完成相同的任务

我看到下面的猎犬示例,它完成了相同的任务,并且不匹配周期,但它是否使用
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=

对于您的应用程序,您可能会发现indexOf比regex更有用

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);
}

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

正则表达式很难正确表达


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

在regex中,点匹配任何单个字符。您在未替换的regex上进行匹配,而不是检查字符串是否包含子字符串。@JohnHascall您的答案非常有效。我想知道这件事。在其中,它们定义了一个数组和一个具有相同名称“states”的建议引擎。两件事怎么能用同一个名字来定义?@user4584963我也不明白这个例子,对不起。