Existe-t-il un équivalent de IEnumerable.Any(Predicate<T>)
en JavaScript ou jQuery?
Je valide une liste d'éléments et souhaite rompre tôt si une erreur est détectée. Je pourrais le faire en utilisant $.each
, mais je dois utiliser un indicateur externe pour voir si l'élément a réellement été trouvé:
var found = false;
$.each(array, function(i) {
if (notValid(array[i])) {
found = true;
}
return !found;
});
Quel serait un meilleur moyen? Je n'aime pas utiliser plain for
avec des tableaux JavaScript car il effectue une itération sur tous ses membres, pas seulement sur des valeurs.
Ces jours-ci, vous pourriez réellement utiliser Array.prototype.some
(spécifié dans ES5) pour obtenir le même effet:
array.some(function(item) {
return notValid(item);
});
Vous pouvez utiliser une variante de jQuery is
function qui accepte un prédicat:
$(array).is(function(index) {
return notValid(this);
});
Vous devriez utiliser une boucle for
ordinaire (pas for ... in
), qui ne fera que parcourir les éléments du tableau.
La réponse de Xion est correcte. Pour développer sa réponse:
la fonction .is(function)
de jQuery a le même comportement que la fonction IEnumerable.Any(Predicate<T>)
de .NET.
De http://docs.jquery.com/is :
Vérifie la sélection actuelle par rapport à une expression et renvoie true si au moins un élément de la sélection correspond à l'expression donnée.
Je vous suggère d'utiliser la méthode $.grep()
. C'est très proche de IEnumerable.Any(Predicate<T>)
:
$.grep(array, function(n, i) {
return (n == 5);
});
Voici un exemple de travail: http://jsfiddle.net/ErickPetru/BYjcu/ .
Je vous suggère d'essayer la boucle JavaScript for in
. Sachez toutefois que la syntaxe est très différente de celle obtenue avec un .net IEnumerable
. Voici un petit exemple de code illustratif.
var names = ['Alice','Bob','Charlie','David'];
for (x in names)
{
var name = names[x];
alert('Hello, ' + name);
}
var cards = { HoleCard: 'Ace of Spades', VisibleCard='Five of Hearts' };
for (x in cards)
{
var position = x;
var card = card[x];
alert('I have a card: ' + position + ': ' + card);
}
Avec https://www.npmjs.com/package/manipula qui implémente toutes les méthodes C # LINQ, ce serait:
Manipula.from([0,1]).any(x=>x>0)
Vous pouvez utiliser array.filter (IE 9+ voir lien ci-dessous pour plus de détails)
[].filter(function(){ return true|false ;}).length > 0;
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter