我添加了一个预先搜索。 Everithing正在发挥作用,但我发现了一个问题。我的json中有文字,例如 "嗨,我的名字是Jason(Mckay)和......"
当我尝试从这个字符串中键入一些单词时,everithin就可以了,但是当我输入" ("或" )"我将有一个例外:
Uncaught SyntaxError: Invalid regular expression: /(/: Unterminated group
我正在研究先行者"基础知识"并有相同的错误:
https://twitter.github.io/typeahead.js/examples/#prefetch
当我尝试首先输入任何nubmers " 1" ," 2" 等等时...... / p>
这是我的默认substringMatcher,问题出在哪里:
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);
};
};
答案 0 :(得分:2)
使用正则表达式会很痛苦,因为所有“特殊”字符都是([etc
您的代码似乎很简单,无论如何都不能使用RegExp - indexOf应该做的伎俩
var substringMatcher = function(strs) {
return function findMatches(q, cb) {
q = q.toLowerCase();
var matches = strs.filter(function(str) {
return str.toLowerCase().indexOf(q) >= 0;
});
cb(matches);
};
};
是的,ES2015 +有String#includes方法更有意义使用 - 但为什么不使用ES2015 +的所有好处
const substringMatcher = strs => (q, cb) => {
q = q.toLowerCase();
cb(strs.filter(str => str.toLowerCase().includes(q)));
};
或效率较低(toLowerCase比需要更频繁地调用,但代码更性感
const substringMatcher = strs => (q, cb) => cb(strs.filter(str => str.toLowerCase().includes(q.toLowerCase())));