web-dev-qa-db-ja.com

LINQ Any()に相当するJavaScript / jQuery

JavaScriptまたはjQueryにIEnumerable.Any(Predicate<T>)に相当するものはありますか?

アイテムのリストを検証していますが、エラーが検出された場合は早期に中断したいと考えています。 $.each、しかし、アイテムが実際に見つかったかどうかを確認するには、外部フラグを使用する必要があります。

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

より良い方法は何でしょうか?単純なforをJavaScript配列で使用するのは好きではありません。値だけでなく、すべてのメンバーを反復処理するからです。

60
dilbert

最近、あなたは実際に使うことができます Array.prototype.some (ES5で規定)同じ効果を得るには:

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

述語を受け入れるjQueryのバリアント is 関数を使用できます。

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

配列要素のみをループする通常のforループ(for ... inではなく)を使用する必要があります。

5
SLaks

Xionの答えは正しいです。彼の答えをさらに詳しく説明します。

jQueryの.is(function)は、.NETのIEnumerable.Any(Predicate<T>)と同じ動作をします。

から http://docs.jquery.com/is

現在の選択を式に対してチェックし、選択の少なくとも1つの要素が指定された式に適合する場合はtrueを返します。

4
Scott Rippey

JavaScriptを試すことをお勧めしますfor inループ。ただし、構文は.net IEnumerableで得られるものとはかなり異なることに注意してください。以下は、コード例の小さなサンプルです。

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

すべてのC#LINQメソッドを実装する https://www.npmjs.com/package/manipula を使用すると、次のようになります。

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

あなたはarray.filterを使用するかもしれません(IE 9+詳細については以下のリンクを参照してください)

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

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

0

$.grep()メソッドを使用することをお勧めします。 IEnumerable.Any(Predicate<T>)に非常に近い:

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

ここであなたに働くサンプル: http://jsfiddle.net/ErickPetru/BYjcu/

0