35 votes

Quelle fonction agit comme .SelectMany () dans jQuery?

Laissez-moi vous expliquer plus:

nous savons que la fonction map en jQuery agit comme .Sélectionnez() (comme dans LINQ).

$("tr").map(function() { return $(this).children().first(); }); // returns 20 tds

maintenant, la question est comment pouvons-nous avoir .SelectMany() en jQuery?

$("tr").map(function() { return $(this).children(); }); // returns 10 arrays not 20 tds!

voici mon exemple en action: http://jsfiddle.net/8aLFQ/4/
"l2" doit être de 8 si nous avons selectMany.

[NOTE] merci de ne pas tenir à cet exemple, le code ci-dessus est juste vous montrer ce que je veux dire par SelectMany() sinon, il est très facile de dire $("tr").les enfants();

J'espère que c'est assez clair.

43voto

SLaks Points 391154

map aplatira les tableaux natifs. Par conséquent, vous pouvez écrire:

 $("tr").map(function() { return $(this).children().get(); })
 

Vous devez appeler .get() pour renvoyer un tableau natif plutôt qu'un objet jQuery.

Cela fonctionnera également sur les objets normaux.

 var nested = [ [1], [2], [3] ];
var flattened = $(nested).map(function() { return this; });
 

flattened sera égal à [1, 2, 3] .

25voto

Šime Vidas Points 59994

Tu veux ça:

 $("tr").map(function() { return $(this).children().get(); });
 

Démo en direct: http://jsfiddle.net/8aLFQ/12/

5voto

Malvolio Points 11824

Vous allez vous lancer:

$("tr").map(function() { return [ $(this).children() ]; }); 

C'est les choses simples de la vie que vous chérissez. -- Fred Kwan

EDIT: Wow, ça m'apprendra à pas de réponses de test à fond.

Le manuel dit qu' map aplatit les tableaux, donc, je suppose que ce serait aplatir un tableau comme objet. Non, vous devez explicite convertir, comme suit:

$("tr").map(function() { return $.makeArray($(this).children()); }); 

Les choses devraient être aussi simples que possible, mais pas plus. -- Albert Einstein

4voto

gnarf Points 49213

$.map attend une valeur (ou un tableau de valeurs) est retourné. L'objet jQuery vous êtes de retour est utilisé comme une "valeur" à la place d'un "tableau" (qui s'aplatissent)

Tout ce que vous devez faire est de retourner un tableau d'éléments du DOM. jQuery fournit un .get() méthode qui retourne un simple tableau à partir d'une sélection.

$("tr").map(function() { return $(this).children().get() });

Bien sûr, je comprends que c'est un très artificiel exemple, depuis $("tr").children() fait la même chose avec beaucoup moins d'appels de fonction.

http://jsfiddle.net/gnarf/8aLFQ/13/

1voto

Jason Gennaro Points 20848

Pas sûr au sujet d' .selectMany() mais vous pouvez changer la position de l' .children pour obtenir le résultat souhaité.

var l2 = $("tr").children().map(function() { return $(this); }).length;

http://jsfiddle.net/8aLFQ/5/

MODIFIER

Je pense que je comprends mieux ce que vous êtes après, à la suite des observations.

Vous pouvez appeler $.makeArray(l2) pour revenir à ce que vous êtes après... c'est-à 8 objets/tableaux

http://jsfiddle.net/8aLFQ/10/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X