web-dev-qa-db-fra.com

Équivalent JavaScript/jQuery de LINQ Tout ()

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.

47
dilbert

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);
});
65
Sean Vieira

Vous pouvez utiliser une variante de jQuery is function qui accepte un prédicat:

$(array).is(function(index) {
    return notValid(this);
});
18
Xion

Vous devriez utiliser une boucle for ordinaire (pas for ... in), qui ne fera que parcourir les éléments du tableau.

5
SLaks

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.

4
Scott Rippey

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/ .

1
Erick Petrucelli

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

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)
0
razon

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

0
Anthony Johnston