2012-07-03 12 views
26

Digamos que tengo una matriz de objetos jQuery y deseo tener un objeto jQuery compuesto en su lugar.Cómo crear objetos jQuery a partir de una matriz de objetos jQuery?

¿Cuál sería la solución que no sea el recorrido manual de una matriz y anexar los elementos al objeto jquery recién creado usando .add()?

Esto no hace lo que yo quiero:

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/

El resultado esperado es dos divs están ocultos.

¿Alguna idea?

+2

Su violín parece tener un error; no hay elemento '# c'. Editar: con respecto a su pregunta, creo que 'add()' puede ser la única opción. Pero no estoy del todo seguro. – powerbuoy

+0

@powerbuoy: sí, eso fue un error tipográfico, gracias – zerkms

Respuesta

26

Trate

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

O

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

The demo.

+0

Sí, lo que pensé es 'var d = $ (c.map (función (el) {return el [0];}));'. +1 porque actualmente es la única respuesta que responde a la pregunta original – zerkms

+1

'return el [0];' solo obtendrá el primer elemento, si el selector coincide con múltiples elementos, el elemento izquierdo no estará en 'd'. – xdazz

+0

a la derecha, no lo tomé en cuenta (muy probablemente porque tengo solo un elemento por objeto) – zerkms

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

Editar: esto va a hacer, feo Tho:

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

No tengo selectores, tengo una matriz de objetos – zerkms

1

Puede usted 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

Ya tengo una matriz de objetos. Entonces, las variables 'a, b, c' del ejemplo no se pueden cambiar – zerkms

+0

¡Entonces probablemente puedas crear otra matriz d iterando a través de' c'! –

+0

Sí. Ahora hace el trabajo. Aunque crear un objeto jquery y usar '.add()' podría ser un poco mejor – zerkms

0

Suponiendo que usted sabe que tiene una matriz de objetos jQuery, puede utilizar $.each para recorrerlos (o simplemente tratarlos como una matriz normal para recorrerlos). Puede usar esto para crear un selector combinado si lo desea, o simplemente hacer operaciones sobre ellos en el iterador.

+0

Sí, puedo recorrerlos y lo que viene después?Esta respuesta no está completa, siempre y cuando no indique exactamente cómo obtenemos el objeto jquery como resultado – zerkms

+0

@zerkms ¿por qué necesita el objeto jQuery en particular en lugar de hacer operaciones en la iteración? –

+0

porque necesito pasar el objeto en una función siguiente, que asume que es el único objeto jquery – zerkms

1

Prueba esto:

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

Vine aquí buscando una respuesta más limpia de la que ya tenía, pero no encontré ninguna. Por el bien del individuo siguiente a venir supongo que voy a publicar mi solución en su lugar:

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

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

Soy una especie de sorprendida no hay alguna jQuery método específico que hace que este más limpia, pero es definitivamente Array.reduce la herramienta correcta para este trabajo si no existe nada más específico en jQuery.

Cuestiones relacionadas