Pesquisa de site

javascript - Maneira rápida de comparar uma string com um array


Eu tenho um array com muitos nomes: {'John Doe', 'Peter Shark', ...}.

Agora eu gostaria de comparar e corresponder uma string, por exemplo, 'Esta é a sua vez John Doe, por favor faça isso' e retornar o(s) nome(s), se o array contiver. A string pode ser um texto longo.

Eu tentei assim, mas não funciona:

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

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

return (stringArray.indexOf(searchStr) > -1)

Resposta #1

Você precisa procurar ao contrário - iterar sobre stringArray e verificar se alguns dos nomes estão contidos em searchStr:

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

Enquanto some é muito limpo e claro, os loops for são ligeiramente mais rápidos do que os métodos de array, embora isso só deva importar se você tiver dezenas de milhares de itens para percorrer:

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

Resposta #2

Expressões regulares são muito boas para encontrar coisas rapidamente. Você pode preparar a regexp com antecedência e depois apenas reutilizá-la mais tarde, se o seu stringArray permanecer o mesmo:

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

let nameMatcher = new RegExp(stringArray.map(
  // https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
  s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
).join('|'));

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

Artigos relacionados