2016-05-25 17 views
15

Come posso verificare se una stringa contiene elementi di un array? Voglio filtrare alcuni array se l'elemento ha una stringa. Si prega di vedere sotto il codice.Verifica se una stringa contiene un elemento in un array in JavaScript

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 

 
    for (var i = 0; i < prohibited.length; i++) { 
 
    if (value.indexOf(prohibited[i]) == -1) { 
 
     return true; 
 
    } else { 
 
     return false; 
 
    } 
 
    } 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);

Il risultato è [ 'apple', 'kiwi', 'orange' ]. Il 'apple' dovrebbe essere rimosso, ma non lo è.

Sopra codice filtrato solo "banana", non "mela". Ho molte parole chiave da filtrare. C'è un modo più semplice?

risposta

15

Il problema si trova nel ciclo for, che esegue una sola iterazione una volta che il ritorno termina la funzione, interrompendo il ciclo for nel processo. Pertanto, è possibile aggiornare il codice in modo tale che la funzione ritorni solo dopo aver completato il ciclo for.

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 

 
    for (var i = 0; i < prohibited.length; i++) { 
 
    if (value.indexOf(prohibited[i]) > -1) { 
 
     return false; 
 
    } 
 
    } 
 
    return true; 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);


Per ridurre la funzione è possibile utilizzare every() e indexOf() metodi

Il 'ogni' metodo esegue la funzione di callback fornita una volta per ogni elemento presente nell'array fino a quando non ne trova uno in cui il callback restituisce un valore falsy (un valore che diventa falso quando viene convertito in un booleano). Se viene trovato un tale elemento, ogni metodo restituisce immediatamente false. Altrimenti, se callback ha restituito un valore vero per tutti gli elementi, ognuno restituirà true. la callback è invocata solo per gli indici dell'array che hanno assegnato valori; esso non viene richiamato per gli indici che sono stati cancellati o che non sono mai stati assegnati valori. (Taken from here)

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 
    return prohibited.every(function(v) { 
 
    return value.indexOf(v) == -1; 
 
    }); 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);


Per il browser più vecchi check polyfill option of every method.


Qui puoi persino utilizzare un'espressione regolare.Generare regex utilizzando la matrice e utilizzare test() controlla partita

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 
    var regex = new RegExp(prohibited.map(function(s) { 
 
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') 
 
    }).join('|')); 
 
    return !regex.test(value); 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);

consultare questa risposta per stringa regex conversione: Can you create JavaScript regexes on the fly using string variables?

0
<script> 
$(document).ready(function(){ 
    var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 

    var prohibited = ['banana', 'apple']; 

$.each(arr,function(arr_index,arr_value) 
{ 
    $.each(prohibited,function(p_index,p_value) 
    { 
     if(arr_value == p_value) 
     { 
      alert(arr_value+" = "+p_value); 
     } 
     else 
     { 
      alert(arr_value+" != "+p_value); 
     } 
    }); 
}); 

}); 
</script> 
+1

Non vedo jQuery menzionato nella domanda da OP, inoltre, alcune spiegazioni di "come funziona il codice" saranno utili. –

+1

JQuery non è stato menzionato ma l'intervistatore ha richiesto di definire un modo più semplice in modo che potesse capire facilmente. Il codice funziona bene, perché l'ho provato. ** ogni ** funzione è simile a ** foreach **, quindi ognuno annidato risolverebbe il problema –

+0

Sicuramente funzionerà, senza dubbio, ma non dovremmo fornire risposte jQuery a domande JavaScript. –

0

Ad esempio costruendo un RegExp e prova contraria:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
var prohibited = ['banana', 'apple']; 

var escapeForRegex = function(str) { 
    return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); 
}; 

var r = new RegExp(prohibited.map(escapeForRegex).join("|")); 
arr.filter(function(v){ return !r.test(v) }); 
11

Può essere così semplice:

const arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
const checker = value => 
 
    !['banana', 'apple'].some(element => value.includes(element)); 
 

 
console.log(arr.filter(checker));

ECMAScript 6 FTW!

Il checker utilizza an arrow function.

Il ! significa che esclude tutti gli elementi che non soddisfano le condizioni.

I some() prove metodo se qualche elemento della matrice passa la prova realizzata dalla funzione prevista.

da Array.prototype.some() docs on MDM

Procedimento includes() determina se una stringa può essere trovato all'interno di un'altra stringa, restituendo true o false come appropriato.

da String.prototype.includes() docs on MDM


Come alcuni più recenti funzionalità ECMAScript non sono supportate in tutti i browser, è necessario utilizzare Babel per compilare il codice per ECMAScript 5.

2

Penso che questo possa essere notevolmente semplificato C'è già un integrato in javascript per controllare queste cose. Considerare:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 

function checker(value) { 
    var prohibited = ['banana', 'apple']; 

    // indexOf() returns -1 if the element doesn't exist in the prohibited array 
    return prohibited.indexOf(value) == -1; 
} 

arr = arr.filter(checker); 
console.log(arr); 
Problemi correlati