52 votes

Transformez un tableau d'éléments jQuery en un ensemble d'éléments enveloppés par jQuery.

Y a-t-il un moyen élégant de transformer [$(div), $(span), $(li)] en $(div, span, li) ?

Ce dont j'ai besoin, c'est d'un ensemble d'éléments enveloppés par jQuery au lieu d'un tableau d'éléments jQuery. Je voudrais faire cela avec le moins de lignes de code possible, et avec un minimum de boucles (voire aucune).

Edit : Pour ceux d'entre vous qui sont déroutés par cette question, ce code est copié et collé à partir de firebug utilisant console.log sur un tableau d'éléments qui ont déjà sélectionné .

3 votes

JQuery doit appeler les éléments entre guillemets : $("li")

2 votes

@jackJoe Je pense qu'il cite directement firebug.

0 votes

Tu veux vraiment dire que tu veux transformer ça : [$(a), $(b), $(c)] dans le résultat de ceci : $(a, b, c) ? Le fait que tous les paramètres soient li rend les choses assez confuses.

51voto

Brock Adams Points 36841

La méthode de jQuery map() fonction est parfait pour remodeler les tableaux et/ou les collections jQuery.

Donc, donné un ensemble de tableaux comme ceci :

var arrayOfJQ_Objects = [$("div"), $("span"), $("li")];

Cette seule ligne de code est tout ce dont vous avez besoin ( Voyez-le en action à jsFiddle ):

$(arrayOfJQ_Objects).map (function () {return this.toArray(); } );

Le résultat est cet affichage de la console dans Firebug :

jQuery(div, span, li)

Référence, également, La méthode de jQuery .toArray() fonction .

20 votes

L'exemple de jsfiddle est bien trop meurtrier J'ai voté contre juste pour les 150 lignes de code pour démontrer $.map().

3 votes

Ça marche aussi : $(arrayOfJQ_Objects).map (function () {return this.get(0);}); o $(arrayOfJQ_Objects).map (function () {return this.get();});

1 votes

"Cette seule ligne de code est tout ce dont vous avez besoin" plus les 149 autres lignes de code. Pourquoi cela a-t-il été accepté comme réponse, ce mur de code est épouvantable.

18voto

jfriend00 Points 152127

Si ce que vous voulez vraiment dire est comment convertir :

[$(a), $(b), $(c)]

dans le résultat de :

$(a, b, c)

vous pouvez alors utiliser la fonction add pour ajouter chaque objet jQuery à un autre objet jQuery :

var x = $();  // empty jQuery object
$.each([$(a), $(b), $(c)], function(i, o) {x = x.add(o)});

À ce stade, x contient un objet jQuery combiné qui est la combinaison des objets jQuery a, b et c précédents dans le tableau.

Je n'ai pas pu trouver de moyen de le faire sans la each() boucle. Le site add() accepte un tableau d'éléments DOM en tant qu'argument, mais (du moins d'après la fonction la documentation ), et non un tableau d'objets jQuery.


Vous pouvez également convertir chaque objet jQuery en un élément DOM, ce qui serait probablement un peu plus efficace car cela ne crée qu'un seul nouvel objet jQuery à la fin :

$([$(".a"), $(".b"), $(".c")].map(function(o) { return o.get() }));

3 votes

add renvoie une copie, donc c'est O(n^2) .

5voto

Guffa Points 308133

Vous pouvez utiliser le add pour copier les éléments d'un objet jQuery dans un autre. Cette méthode copiera tous les éléments de chacun des objets jQuery dans le tableau. source dans l'objet jQuery items :

// Create an empty jQuery object
var items = $([]);
// Add the elements from each jQuery object to it
$.each(source, function(){ items = items.add(this); });

(Avant la version 1.3.2, la fonction add ne prend pas en charge l'ajout d'un objet jQuery, vous devez donc utiliser la méthode suivante items.add(this.get()); à la place).

0 votes

Quelle est la raison de ne pas faire var items = $() ? pour créer votre objet jQuery vide ?

0 votes

Pour information, cette solution ne semble fonctionner que lorsque je remplace items.add(this) ; par items = items.add(this) ; Je suppose que .add() ne modifie pas l'objet sur lequel il a été appelé.

0 votes

@Scott Greenfield : C'est exact. J'ai mis à jour le code dans la réponse pour refléter cela.

2voto

kayz1 Points 2412

Pour ajouter un seul élément :

var $previousElements = $();
$previousElements.add($element); 

pour convertir un tableau en un ensemble d'éléments jQuery :

var myjQueryElementArray = [$element1, $element2, $elementN];
$(myjQueryElementArray ).map (function () {return this.toArray(); } );

pour ajouter un tableau d'éléments aux éléments existants :

var $previousElements = $(),
     myjQueryElementArray = [$element1, $element2, $elementN];

$previousElements.add($(myjQueryElementArray).map (function () {return this.toArray(); } ));

0 votes

Pour en venir au fait excellente réponse merci de ne pas faire de lien vers 150 lignes de code js dans jsfiddle juste pour démontrer .map()

1voto

fncomp Points 3194

Modifier : Je pensais que jQuery supportait tous les Array mais non, voici donc une version fonctionnelle de ma solution initiale, bien qu'elle soit un peu bizarre puisque je m'en tiens aux mêmes méthodes :

var set; // The array of jQuery objects, 
         // but make sure it's an Array.
var output = set.pop();
$.each(set, function (_, item) { 
    return [].push.call(output, [].pop.call(item));
});

0 votes

Renvoie et supprime le dernier élément d'un tableau.

0 votes

Cela ne ferait que créer un nouveau tableau qui contiendrait exactement la même chose que l'ancien.

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