2012-07-03 19 views
26

Diciamo che ho una matrice di oggetti jQuery e desidero invece avere un oggetto jQuery composto.Come creare oggetti jQuery dalla matrice di oggetti jQuery?

Quale sarebbe la soluzione diversa dal passaggio manuale di un array e dall'aggiunta degli elementi all'oggetto jquery appena creato utilizzando .add()?

Questo non fa quello che voglio:

var a = $('#a'), 
    b = $('#b'), 
    c = [a, b]; 

// the lines above is the set up, they cannot be changed 
var d = $(c); 
d.hide();​ 

http://jsfiddle.net/zerkms/896eN/1/

Il risultato atteso è entrambe le div sono nascosti.

Qualche idea?

+2

Il vostro violino sembra avere un errore; non c'è elemento '# c'. Modifica: per quanto riguarda la tua domanda credo che 'add()' potrebbe essere l'unica opzione. Ma non ne sono del tutto sicuro. – powerbuoy

+0

@powerbuoy: sì, quello era un errore di battitura, grazie – zerkms

risposta

26

Prova

var d = $($.map(c, function(el){return $.makeArray(el)})); 

O

var d = $($.map(c, function(el){return el.get();})); 

The demo.

+0

Sì, quello che ho pensato è 'var d = $ (c.map (function (el) {return el [0];}));'. +1 perché attualmente è l'unica risposta che risponde alla domanda originale – zerkms

+1

'return el [0];' otterrà solo il primo elemento, se il tuo selettore corrisponde a più elementi, l'elemento di sinistra non sarà in 'd'. – xdazz

+0

a destra, non ne ha tenuto conto (molto probabilmente perché ho solo un elemento per oggetto) – zerkms

0
var els = ['#a', '#b', '#c'] 
var $els = $(els.join(', ')) 

Edit: Questo farà, brutta tho:

var d = $(function(){ 
    var els = [] 
    for (var i = 0, l = c.length; i < l; i++) 
     els.push(c[i][0]) 
    return els 
}()) 
+0

Non ho selettori, ho una matrice di oggetti – zerkms

1

Can si try

var a = $('#a'), 
b = $('#b'), 
c = [a, b]; 
d = []; 
$.each(c, function(i, v){ 
    if(v.length>0){ 
     d.push(v[0]); 
    } 
}); 

e = $(d); 
e.hide(); 
+0

Ho già una matrice di oggetti. Quindi le variabili 'a, b, c' dell'esempio non possono essere modificate – zerkms

+0

Quindi probabilmente è possibile creare un altro array d iterando tramite' c'! –

+0

Sì. Ora fa il lavoro. Anche se creare oggetti jquery e usare '.add()' potrebbe essere un po 'meglio – zerkms

0

Supponendo di sapere che avete un array di oggetti jQuery, è possibile utilizzare $.each per scorrerle (o trattarle come un normale array per scorrerle). Puoi usarlo per creare un selettore combinato, se lo desideri, o semplicemente eseguire operazioni su di esso nell'iteratore.

+0

Sì, posso attraversarli e quali sono i prossimi?Questa risposta non è completa, purché non indichi esattamente come otteniamo l'oggetto jquery come risultato – zerkms

+0

@zerkms perché è necessario l'oggetto jQuery in particolare anziché eseguire le operazioni nell'iterazione? –

+0

perché ho bisogno di passare l'oggetto in una funzione successiva, che presuppone che sia il singolo oggetto jquery – zerkms

1

Prova questo:

var a = $('#a'), 
    b = $('#b'), 
    c = [a, b], 
    d = $(); 
$.each(c, function(i, jqObj) { 
    $.merge(d, jqObj); 
}); 
d.hide(); 

o:

var a = $('#a'), 
    b = $('#b'), 
    c = [a, b], 
    d = $(); 
$.each(c, function(i, jqObj) { 
    d = d.add(jqObj); 
}); 
d.hide(); 
5

Sono venuto qui cercando una risposta più pulita di quella che avevo già, ma non l'ho trovata. Per il bene del ragazzo accanto a venire insieme Credo che vi posterò la mia soluzione, invece:

var a = $('#a'), 
    b = $('#b'), 
    c = [a, b]; 

var d = c.reduce($.merge); 
d.hide();​ 

Sono una specie di sorpresa, non v'è un certo jQuery metodo specifico che rende questo più pulito, ma è sicuramente Array.reduce lo strumento corretto per questo lavoro se non esiste nulla di più specifico in jQuery.

Problemi correlati