it-swarm.com.de

JavaScript/jQuery-Äquivalent von LINQ Any ()

Gibt es ein Äquivalent zu IEnumerable.Any(Predicate<T>) in JavaScript oder jQuery?

Ich überprüfe eine Liste von Elementen und möchte frühzeitig brechen, wenn ein Fehler entdeckt wird. Ich könnte es mit $.each tun, aber ich muss ein externes Flag verwenden, um zu sehen, ob der Artikel tatsächlich gefunden wurde:

var found = false;
$.each(array, function(i) {
    if (notValid(array[i])) {
        found = true;
    }
    return !found;
});

Was wäre ein besserer Weg? Ich mag es nicht, einfache for mit JavaScript-Arrays zu verwenden, da sie alle ihre Mitglieder durchlaufen und nicht nur Werte.

47
dilbert

In diesen Tagen könnten Sie tatsächlich Array.prototype.some (in ES5 angegeben) verwenden, um den gleichen Effekt zu erzielen:

array.some(function(item) {
    return notValid(item);
});
65
Sean Vieira

Sie können die Variante von jQuery is verwenden, die ein Prädikat akzeptiert:

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

Sie sollten eine normale for-Schleife (nicht for ... in) verwenden, die nur Array-Elemente durchläuft.

5
SLaks

Xions Antwort ist richtig. Um seine Antwort zu erweitern:

die .is(function) von jQuery hat das gleiche Verhalten wie IEnumerable.Any(Predicate<T>) von .NET.

Von http://docs.jquery.com/is :

Überprüft die aktuelle Auswahl anhand eines Ausdrucks und gibt true zurück, wenn mindestens ein Element der Auswahl in den angegebenen Ausdruck passt.

4
Scott Rippey

Ich empfehle Ihnen, die $.grep()-Methode zu verwenden. Es ist sehr nahe an IEnumerable.Any(Predicate<T>):

$.grep(array, function(n, i) {
  return (n == 5);
});

Hier ein Arbeitsbeispiel für Sie: http://jsfiddle.net/ErickPetru/BYjcu/ .

1

Ich würde vorschlagen, dass Sie die JavaScript-for in-Schleife ausprobieren. Beachten Sie jedoch, dass sich die Syntax von der, die Sie mit einer .net IEnumerable erhalten, unterscheidet. Hier ist ein kleines illustratives Codebeispiel.

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

Mit https://www.npmjs.com/package/manipula , das alle C # LINQ-Methoden implementiert, wäre es:

Manipula.from([0,1]).any(x=>x>0)
0
razon

Sie können array.filter verwenden (IE 9+ siehe Link unten für mehr Details)

[].filter(function(){ return true|false ;}).length > 0;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

0