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