替代.includes()?

时间:2017-02-10 10:44:48

标签: javascript arrays

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

举个例子。如果我正在寻找'墙',它会变得困惑,它会返回'钱包'。此外,我希望输入是灵活的。因此,例如,如果输入玻璃,项目“玻璃碎片”仍然可以退回。

是否有更准确的方法来匹配确切的单词?

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

2 个答案:

答案 0 :(得分: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/,我会一直使用它来验证我构建的表达式是否准确。

答案 1 :(得分:2)

我认为您可以使用splitindexOf方法代替它。拆分后,您可以使用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]);
            };
        }
    };