Vérifier si une chaîne de caractères contient un élément D'un tableau dans JavaScript
Comment puis-je vérifier si une chaîne contient tout élément d'un tableau? Je veux filtrer un tableau si l'élément a une chaîne de caractères. Veuillez voir ci-dessous le code.
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);
Le résultat est [ 'apple', 'kiwi', 'orange' ]
. 'apple'
devrait être supprimé, mais il ne l'est pas.
code ci-dessus seulement "banane" filtrée, pas "pomme". J'ai beaucoup de mots-clés à filtre. Est-il un moyen plus facile?
6 réponses
le problème réside dans la boucle for, qui ne se répète qu'une seule fois depuis que return termine la fonction, coupant la boucle for dans le processus. Ainsi, vous pouvez mettre à jour le code de la façon suivante pour que la fonction ne revienne qu'une fois la boucle for terminée .
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);
Pour la réduction de la fonction, vous pouvez utiliser every()
et indexOf()
méthode
la méthode du "tout" exécute la fonction de callback fournie une fois pour chaque élément présent dans le tableau jusqu'à ce qu'il en trouve un où callback renvoie une valeur falsy (une valeur qui devient false lorsqu'elle est convertie en booléen). Si un tel élément est trouvé, la méthode retourne false. Sinon, si callback renvoie une valeur true pour tous les éléments, tous retourneront true. callback n'est invoqué que pour les index du tableau qui ont des valeurs attribuées; il n'est pas invoqué pour les index qui ont été supprimés ou qui n'ont jamais été affectées des valeurs.(depuis)
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);
pour les navigateurs plus anciens cochez l'option polyfill de chaque méthode.
vous pourriez même utiliser un regex ici. Générez regex en utilisant le tableau et utilisez test()
à vérifier la correspondance
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);
Consultez cette réponse pour la chaîne regex conversion: pouvez-vous créer des regexes JavaScript à la volée en utilisant des variables string?
C'est peut-être aussi simple que cela:
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!
checker
une fonction de flèche.
!
signifie qu'il exclura tous les éléments qui ne remplissent pas les conditions.
some()
la méthode teste si un élément du tableau passe le test implémenté par la fonction fournie.
à partir de Array.prototype.some()
docs on MDM
includes()
la méthode détermine si une chaîne peut être trouvée dans une autre chaîne, en retournanttrue
oufalse
selon le cas.
String.prototype.includes()
docs on MDM
comme certaines des dernières fonctionnalités D'ECMAScript ne sont pas prises en charge par tous les navigateurs, vous devez utiliser Babel pour compiler votre code en ECMAScript 5.
je pense que cela peut être grandement simplifiée. Il y a déjà un JavaScript intégré pour vérifier ces choses. Considérer:
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);
Par exemple par la construction d'une RegExp et les essais contre:
var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];
var prohibited = ['banana', 'apple'];
var escapeForRegex = function(str) {
return String(str).replace(/([.*+?^=!:${}()|[\]\/\])/g, '\');
};
var r = new RegExp(prohibited.map(escapeForRegex).join("|"));
arr.filter(function(v){ return !r.test(v) });
Certains diront que c'est une pratique incertaine, mais vous trouverez peut-être utile de disposer d'une méthode que vous pouvez exécuter sur la chaîne directement - dans ce cas, vous pourriez élargir le JavaScript Chaîne objet à l'aide de Chaîne de caractères.prototype.
Comme ceci...
String.prototype.containsAny = String.prototype.containsAny || function(arr) {
for (var i = 0; i < arr.length; i++) {
if (this.indexOf(arr[i]) > -1) {
return true;
}
}
return false;
};
Comme vous pouvez le voir dans cet exemple, il sera par défaut à toute définition d'un containsAny
méthode. Gardez à l'esprit: chaque fois que vous augmentez objets encastrés, c'est une bonne idée de vérifier au moins d'abord la présence de la propriété – peut-être qu'un jour elle existera...
\_(ツ)_/
découvrez ce violon pour l'utilisation ou voir ci-dessous:
var str = 'This is a sentence as a string.';
console.log(str.containsAny(['string1', 'string2', 'string3'])); // -> returns false
console.log(str.containsAny(['string', 'string1', 'string2'])); // -> returns true
<script src="//cdn.simpledigital.net/common/js/extensions/String.prototypeHelpers.js"></script>
<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>