如何获取字符串中首个存在于指定数组中的匹配元素?
解决方法:找到目标字符串中第一个出现的数组元素
你现在用some()只能得到布尔值,确实没法拿到具体的元素。这里有两种思路,根据你的实际需求来选:
情况1:只要数组中第一个存在于目标字符串里的元素(不管它在字符串里的位置)
如果你的需求是从数组顺序出发,找到数组里第一个能在body中找到的元素,直接用Array.find()就可以了,它会返回数组中第一个满足条件的元素:
const arrayOfWord=['@Robot','@Human','@Animal','@Hero'] const body = 'This is a try to found the @Human & the @Animal' const firstMatch = arrayOfWord.find(word => body.includes(word)); console.log(firstMatch); // 输出 '@Human'
find()和some()逻辑类似,但它会返回符合条件的第一个元素,而不是布尔值。在你的例子里,@Robot不在body里,所以会跳过,找到下一个@Human并返回,刚好符合你的预期。
情况2:要找目标字符串中最先出现的数组元素(不管数组顺序)
如果数组的顺序和字符串里出现的顺序不一致,比如数组是['@Animal','@Human'],但body里先出现@Human,这时候find()会返回@Animal(因为它是数组里第一个存在于body的元素),但这不是你要的结果。这时候需要换一种思路:
- 先过滤出所有存在于
body中的数组元素 - 比较这些元素在
body中的出现位置,找到索引最小的那个
代码实现如下:
const arrayOfWord=['@Robot','@Human','@Animal','@Hero'] const body = 'This is a try to found the @Human & the @Animal' // 第一步:过滤出在body里存在的单词 const validWords = arrayOfWord.filter(word => body.includes(word)); if (validWords.length === 0) { console.log('没有匹配的单词'); // 处理无匹配的情况 } else { // 第二步:找到在body中出现最早的单词 const firstInBody = validWords.reduce((prevWord, currWord) => { return body.indexOf(prevWord) < body.indexOf(currWord) ? prevWord : currWord; }); console.log(firstInBody); // 输出 '@Human' }
这个方法会先筛选出所有有效的单词,再通过reduce()比较它们在body中的起始索引,最终得到字符串里最先出现的那个数组元素,不管数组本身的顺序如何。
补充说明
body.includes(word)可以判断单词是否存在,但如果你的单词可能是其他单词的一部分(比如@Hum和@Human),建议用正则表达式来匹配完整的单词,避免误判。比如:const regex = new RegExp(`\\b${word}\\b`); // 匹配完整单词 return regex.test(body);- 如果没有任何匹配的元素,
find()会返回undefined,而上面的过滤+reduce方法可以手动处理无匹配的情况,返回你想要的提示或值。
内容的提问来源于stack exchange,提问作者Lisa123456
相关产品推荐
相关产品推荐

