2016-05-04 5 views
11

C'è un modo in lodash per verificare se una stringa contiene uno dei valori di una matrice?lodash _. contiene uno di più valori nella stringa

Ad esempio:

var text = 'this is some sample text'; 
var values = ['sample', 'anything']; 

_.contains(text, values); // should be true 

var values = ['nope', 'no']; 
_.contains(text, values); // should be false 
+1

Lo si può fare facilmente senza lodash 'values.some (el => text.indexOf (el)> -1)' btw. – Andy

risposta

2

Un'altra soluzione, probabilmente più efficiente rispetto alla ricerca di ogni valore, può essere quello di creare un'espressione regolare dai valori.

Mentre l'iterazione di tutti i possibili valori implicherà l'analisi multipla del testo, con un'espressione regolare, solo uno è sufficiente.

function multiIncludes(text, values){ 
 
    var re = new RegExp(values.join('|')); 
 
    return re.test(text); 
 
} 
 

 
document.write(multiIncludes('this is some sample text', 
 
          ['sample', 'anything'])); 
 
document.write('<br />'); 
 
document.write(multiIncludes('this is some sample text', 
 
          ['nope', 'anything']));

Limitazione Questo approccio sarà sicuro per i valori contenenti uno dei seguenti caratteri: \^$ * + ? . () | { } [ ] (fanno parte della sintassi regex).

Se questa è una possibilità, è possibile utilizzare la seguente funzione (da sindresorhus di escape-string-regexp) per proteggere (fuga) i valori rilevanti:

function escapeRegExp(str) { 
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
} 

Tuttavia, se avete bisogno di chiamare per ogni possibile values, è possibile che una combinazione di Array.prototype.some e String.prototype.includes diventi più efficiente (vedere @Andy e la mia altra risposta).

+0

Sì, penso che usare una regex sia l'opzione migliore allora. – yeouuu

+1

LOL yeaaahhhh regexps .... ragazzi, qualcuno dovrà sostenere il tuo inferno dopo di te. –

1

No. Ma questo è facile da implementare utilizzando String.includes. You don't need lodash.

Ecco una semplice funzione che fa proprio questo:

function multiIncludes(text, values){ 
 
    return values.some(function(val){ 
 
    return text.includes(val); 
 
    }); 
 
} 
 

 
document.write(multiIncludes('this is some sample text', 
 
          ['sample', 'anything'])); 
 
document.write('<br />'); 
 
document.write(multiIncludes('this is some sample text', 
 
          ['nope', 'anything']));

11

Usa _.some e _.includes:

_.some(values, (el) => _.includes(text, el)); 

DEMO

+0

Anche una buona opzione. +1 per le funzioni della freccia ;-) – yeouuu