快速比较字符串和数组的方法

4

我有一个包含很多名字的数组:{'约翰·多', '彼得·鲨鱼', ...}

现在,我想比较和匹配一个字符串,例如'这是你的机会,约翰·多,请做好准备',如果数组中包含该名字,则返回名字(们)。该字符串可以是一段长文本。

我尝试了以下方法,但并不起作用:

var searchStr = "This is your turn John Doe, pls do it"

var stringArray = ["John Doe", "Peter Shark"];

return (stringArray.indexOf(searchStr) > -1)
2个回答

10
你需要反过来搜索-遍历stringArray并检查searchStr中是否包含some名称:

var searchStr1 = "This is your turn John Doe, pls do it";
var stringArray = ["John Doe", "Peter Shark"];
console.log(stringArray.some(name => searchStr1.includes(name)));

var searchStr2 = "This is your turn Foo Bar, pls do it";
console.log(stringArray.some(name => searchStr2.includes(name)));

虽然some非常简洁明了,但for循环比数组方法略快,尽管只有在需要迭代数万个项目时才会有影响:

var searchStr = "This is your turn John Doe, pls do it";
var stringArray = ["John Doe", "Peter Shark"];

const searchFor = stringArray => {
  for (let i = 0, { length } = stringArray; i < length; i++) {
    if (searchStr.includes(stringArray[i])) return true;
  }
  return false;
};

console.log(searchFor(["John Doe", "Peter Shark"]));
console.log(searchFor(["Foo Bar", "Peter Shark"]));


2

正则表达式非常擅长快速查找内容。您可以提前准备好正则表达式,然后在以后重复使用它,如果您的 stringArray 保持不变:

let searchStr = "This is your turn John Doe, pls do it"
let stringArray = ["John Doe", "Peter Shark"];

let nameMatcher = new RegExp(stringArray.map(
  // https://dev59.com/AXA65IYBdhLWcg3w7DT8
  s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
).join('|'));

console.log(searchStr.match(nameMatcher));


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