JavaScript / jQuery equivalente a LINQ Any ()

¿Hay un equivalente de IEnumerable.Any(Predicate<T>) en JavaScript o jQuery?

Estoy validando una lista de elementos y quiero romper antes si se detecta un error. Podría hacerlo usando $.each, pero necesito usar una bandera externa para ver si realmente se encontró el artículo:

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

¿Cuál sería una mejor forma? No me gusta usar simple for con matrices de JavaScript porque itera sobre todos sus miembros, no solo sobre los valores.

preguntado el 10 de mayo de 11 a las 13:05

7 Respuestas

En estos días realmente podrías usar Array.prototype.some (especificado en ES5) para obtener el mismo efecto:

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

contestado el 02 de mayo de 14 a las 05:05

sumario rápido: some() ejecuta la función de devolución de llamada una vez para cada elemento presente en la matriz hasta que encuentra una en la que la devolución de llamada devuelve un valor verdadero. Si se encuentra tal elemento, some() inmediatamente devuelve verdadero. De lo contrario, some() devuelve falso. - Simon_Weaver

Esta es la respuesta correcta si puede usarla. Es una función equivalente a Linq.Any () - Ed Obispo

Si necesita compatibilidad con IE8, esta no es una opción. - Akira Yamamoto

Actualización: en ES6 / ECMAScript 2015, puede hacer myArray.some(c=>c) para imitar exactamente lo que hace LINQ con .Any (). Teniendo en cuenta que en LINQ el método .Any () no requiere un delegado, mientras que .some () sí. Intentar llamar a .some () sin un delegado resultará en un error ya que el delegado no estará definido. - Hardrada

Podrías usar la variante de jQuery is función que acepta un predicado:

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

contestado el 02 de mayo de 14 a las 05:05

Creo que deberías evitar usar this dentro de is función cuando se utiliza para un array. Porque no obtendrá el tipo original (por lo que la comparación con "===" fallará). Yo usaría array[i] en lugar de. Mira esto: jsfiddle.net/BYjcu/3 - Mariano Desanze

Esto es interesante (mi violín para confirmar) pero mi reacción instintiva es evitar este enfoque, ya que está operando una función de selección $.fn.is sobre una colección que no es una selección de jQuery (una matriz nativa). Si hubiera una función de utilidad como $.is Me sentiría más seguro, pero parece ser una "función" indocumentada: mlhDev

Selecciones de AFAIK jQuery son matrices nativas (o al menos usan Array.prototype), y probablemente haya suficiente código en la naturaleza confiando en él que nunca podrá cambiar. Este dicho, esta respuesta tiene casi seis años. En estos días, debería usar el enfoque nativo de ES5 que se muestra cerca, o algo como LoDash / Underscore / etc. que tiene API específicamente para tratar con matrices JS nativas. - Xion

Tienes razón, no me di cuenta de la fecha en esta respuesta. Lo siento (¡y ahora no puedo deshacer mi voto negativo!) - mlhDev

La respuesta de Xion es correcta. Para ampliar su respuesta:

jQuery's .is(function) tiene el mismo comportamiento que .NET IEnumerable.Any(Predicate<T>).

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

Compara la selección actual con una expresión y devuelve verdadero, si al menos un elemento de la selección se ajusta a la expresión dada.

Respondido 21 Jul 11, 21:07

Deberías usar un ordinario for bucle (no for ... in), que solo recorrerá los elementos de la matriz.

contestado el 10 de mayo de 11 a las 17:05

* podría (creo que quisiste decir) - Simon_Weaver

@Simon_Weaver: No; él no debe utilizado for in para iterar matrices. - SLaks

@SLaks, ¡has entendido mal el comentario de Simon_Weaver! "Tú podría use un bucle for ordinario. "En lugar de" Usted debemos... "- Chris Haines

Puede usar array.filter (IE 9+, consulte el enlace a continuación para obtener más detalles)

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

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

Respondido el 05 de Septiembre de 16 a las 17:09

Te sugiero que pruebes JavaScript. for in lazo. Sin embargo, tenga en cuenta que la sintaxis es bastante diferente a la que obtiene con un .net IEnumerable. Aquí hay una pequeña muestra de código ilustrativo.

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

contestado el 10 de mayo de 11 a las 18:05

Creo que OP quería decir con llanura for (...) itera sobre todos sus miembros ese uso de for in a veces puede producir resultados inesperados (Si Array.prototype se extiende, o si cambia implícitamente el tamaño de las matrices). - Groo

Te sugiero que uses el $.grep() método. Esta muy cerca de IEnumerable.Any(Predicate<T>):

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

Aquí una muestra de trabajo para ti: http://jsfiddle.net/ErickPetru/BYjcu/.

Edición 2021

Me encantaría señalar para los haters que están votando negativamente aquí, increíbles 10 años después de que se publicó la respuesta, que: 1. Cuando se publicó, era una solución que tenía mucho sentido; 2. No había nada nativo de JavaScript para resolver este problema con una sola llamada de función en ese momento; 3. StackOverflow aún no sabe qué hacer con las respuestas históricas, por lo que los votos negativos no se aplican aquí de todos modos. 4. La pregunta tiene la etiqueta jQuery, por lo que no solo se espera una respuesta basada en jQuery, sino que es la correcta. 5. Si encontró algo que tenga sentido para argumentar que esta respuesta era incorrecta en el momento en que se publicó, Siéntete libre de comentar aquí.

Respondido 19 Jul 21, 21:07

en realidad, $.grep() es más como FindAll(Predicate<T>). - Groo

@Groo: No dije eso Any(Predicate<T>) es el método más cercano a grep(), solo está muy cerca. Estoy de acuerdo que FindAll(Predicate<T>) está mucho más cerca de eso. Pero ambos están cerca. - Erick Petrucelli

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.