.includes() 的替代方案?

新手上路,请多包涵

我正在尝试开发一种方法,将数组 (fItems) 中的单词与已转换为数组 (stringArray) 的字符串中的单词进行匹配。我下面的代码大部分时间都有效,但问题是“includes()”搜索模式,而不是匹配整个单词。

举个例子。如果我正在寻找“wall”,它会感到困惑,它会返回“wallet”。另外,我希望输入灵活。因此,例如,如果输入玻璃,则项目“玻璃碎片”仍然可以退回。

有没有更精确的方法来匹配确切的单词?

 for (let i = 0; i < db.items.length; i++) {
		for (let j = 0; j < stringArray.length; j++) {
			if (db.items[i].name.includes(stringArray[j])) {
				fItems.push(db.items[i]);
			};
		}
	};

原文由 Cuckoo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

来自评论

不,不是直接比较。我希望输入灵活。因此,例如,如果输入玻璃,则项目“玻璃碎片”仍然可以退回。

听起来您真正想要的是字符串中的模式匹配。正则表达式将是最好的选择,因为这就是创建它们的原因( _模式匹配与替换选项_)。

 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

在上面的代码中 \b 用于表示单词边界,因此 glass 是一个匹配项,但 glassware 将不匹配。 i 用于指定不区分大小写。

还可以在将表达式放入代码之前在线测试您的表达式,您可以使用此站点 https://regex101.com/ ,我一直使用它来验证我构建的表达式是否准确。

原文由 Igor 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为您可以使用 splitindexOf 方法代替它。 split后可以用indexOf查看。

来自评论:正如 Pavlo 所说,您也可以使用 includes ,而不是 indexOf 方法。

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

原文由 Kamuran Sönecek 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题