Javascript .includes()的替代方案?
我正在尝试开发一种方法,将数组中的单词(fItems)与转换为数组(stringArray)的字符串中的单词进行匹配。我下面的代码大部分时间都有效,但问题是“includes()”搜索模式,而不是匹配整个单词 举个例子。如果我在找“墙”,它会感到困惑,它会返回“钱包”。此外,我希望输入是灵活的。例如,如果输入了玻璃,“玻璃碎片”项仍然可以返回 有没有更精确的方法来匹配精确的单词Javascript .includes()的替代方案?,javascript,arrays,Javascript,Arrays,我正在尝试开发一种方法,将数组中的单词(fItems)与转换为数组(stringArray)的字符串中的单词进行匹配。我下面的代码大部分时间都有效,但问题是“includes()”搜索模式,而不是匹配整个单词 举个例子。如果我在找“墙”,它会感到困惑,它会返回“钱包”。此外,我希望输入是灵活的。例如,如果输入了玻璃,“玻璃碎片”项仍然可以返回 有没有更精确的方法来匹配精确的单词 for(设i=0;i
for(设i=0;i来自注释
不,不是直接的比较。我希望输入是灵活的。例如,如果输入了玻璃,“玻璃碎片”项仍然可以返回
听起来你真正想要的是字符串中的模式匹配。正则表达式是最好的选择,因为这就是创建正则表达式的原因(模式匹配和替换选项)
在上面的代码中,\b
用于表示单词边界,因此glass
是匹配项,但glassware
不会匹配<代码>i
用于指定不区分大小写
此外,为了在将表达式放入代码之前对其进行在线测试,您可以使用此网站,我一直使用此网站来验证我构建的表达式是否准确。我认为您可以使用
split
和indexOf
方法代替它。拆分后,可以使用indexOf进行检查
评论:正如Pavlo所说,您还可以使用includes
,而不是indexOf
方法
for(设i=0;i
将数据库数据放在一起,你是说直接比较db.items[i].name==stringArray[j]
因此您正在尝试获取两个数组的交集。查一查,你会发现很多解决方案。不,不是直接的比较。我希望输入是灵活的。例如,如果输入了glass,条目“glass shard”仍然可以返回。这听起来像是字符串上的模式匹配,使用正则表达式代替。由于OP使用的是Array.includes
,因此他可以选择指定Unicode安全正则表达式。否则,不要忘记\b
将匹配\w
和任何非ASCII字符之间的空格,包括英语中常用的字母,如“e”。回答不错,希望OP似乎使用ES2015(let
),并且答案中的代码是ES5。@Igor-不幸的是,不容易克服\S
有时可以很好地替代\w
。谢谢。我必须承认,当有人提到regex时,我有点脸色苍白。我想是时候想办法学了。但它们似乎确实让生活更轻松。我将努力学习如何使用它们。@buckoo-我在最后一个表达式中添加了一个更新,用于搜索unicode文本。如果你处理大量文本,正则表达式确实会让生活变得更简单。我经常使用它们(不是双关语),一旦你开始使用它们,你就会很快掌握它们的窍门。你可以使用Array\includes
而不是Array\indexOf
,假设代码是ES2016。@Pavlo感谢你的建议。谢谢你,我刚刚学会了:)我在我发布的原始代码中使用了include,问题是它寻找匹配的模式,而不是整个单词。
let str = 'The glass shard';
let search = 'glass';
let isMatch = new RegExp('\\b'+search+'\\b', 'i').test(str); // i is case insensitive
// If you use unicode characters then this might be a better expression
// thank you @Touffy
let isMatch = new RegExp('(?:^|\\s)'+search, 'i').test(str); // i is case insensitive
for (let i = 0; i < db.items.length; i++) {
for (let j = 0; j < stringArray.length; j++) {
if (db.items[i].name.split(' ').indexOf(stringArray[j])!==-1) {
fItems.push(db.items[i]);
};
}
};