.includes()的替代方法是什么?

3
我正在尝试开发一种方法,将数组(fItems)中的单词与已转换为数组(stringArray)的字符串中的单词进行匹配。我下面的代码大多数情况下都能正常工作,但问题是'includes()'搜索模式而不是匹配整个单词。
例如,如果我要查找'wall',它会混淆并返回'wallet'。此外,我希望输入灵活。因此,例如如果输入'glass',则仍然可以返回项目'glass shard'。
是否有更精确的匹配完整单词的方式?

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


将数据库数据放入。 - parwatcodes
3
你是说只需要进行简单的比较吗?db.items[i].name == stringArray[j] - Igor
1
所以你想要获取这两个数组的“交集”。搜索一下,你会在SO上找到很多解决方案。 - Touffy
1
不,这不是一个简单的比较。我希望输入是灵活的。例如,如果输入“玻璃”,则仍然可以返回“玻璃碎片”这个物品。 - Cuckoo
这听起来像是对字符串进行模式匹配,应该使用正则表达式。它更快、更易于使用。 - Igor
3个回答

3

来自评论

不,这不是直接比较。我希望输入具有灵活性。例如,如果输入“玻璃”,仍然可以返回“玻璃碎片”这个项目。

看起来你真正想要的是字符串中的模式匹配。一个正则表达式将是最好的选择,因为这正是它们被创建的原因(使用模式匹配进行替换)。

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/,我经常使用它来验证我构建的表达式是否准确。

2
由于 OP 使用了 Array.includes,他可能有指定 Unicode 安全正则表达式的选项。否则,请不要忘记 \b 将匹配 \w 和任何非 ASCII 字符之间的空格,包括英语中常用的字母,如“é”。 - Touffy
2
@Igor - 而且不幸的是,这并不容易克服。\S有时可以作为\w的替代品。 - Touffy
1
谢谢。我必须承认,当有人提到正则表达式时,我会有点害怕。我想现在是找到学习它们的方法的时候了。但是它们似乎确实能让生活变得更轻松。我会尝试学习如何使用它们。 - Cuckoo
谢谢,我会尝试实现它。 - Cuckoo
我很困惑该如何在我的代码中实现正则表达式。你能给我一个例子吗?搜索字符串是array1 = ["a","wall"],数据库是array2 = ["a glass shard", "a wallet", "a stone wall"];希望返回值是'a stone wall'。 - Cuckoo
显示剩余2条评论

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

1
如果代码是ES2016,你可以使用Array#includes代替Array#indexOf - Pavlo
@Pavlo 谢谢你的建议。正是因为你,我才刚刚学会了这个技巧 :) - Kamuran Sönecek
我在发布的原始代码中使用了“includes”,问题是它只查找匹配的模式,而不是整个单词。 - Cuckoo

0
创建一个点函数,并像下面的es6 includes()一样在es5中使用它:
String.prototype.includes = function (str) {
 return this.indexOf(str) !== -1;
}

以下是字符串
var myString = 'this is my string';

检查匹配如下:

console.log(myString.includes('string')); // true
console.log(myString.includes('street')); //false

现在你可以使用相同的indexOf方式,将其添加到ES5中的includes中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接