2011-07-28 185 views
46

是否有任何将[$(div), $(span), $(li)]转换为$(div, span, li)的优雅方式?将jQuery元素的数组转换为jQuery包装元素集

我需要的是一组jQuery包装的元素,而不是一组jQuery元素。我想用尽可能少的代码行来做到这一点,并尽可能减少(如果有的话)循环。

编辑:对于那些被这个问题混淆,该代码被复制,并使用已经已经选择元件的阵列上的console.log从萤火虫粘贴。

+3

jQuery需要在引号之间调用元素:'$(“li”)' – jackJoe

+2

@jackJoe我认为他直接引用了萤火虫。 – fncomp

+0

你真的想要把这个变成:[$(a),$(b),$(c)]'到这个结果:'$(a,b,c)'?所有参数都是“li”这一事实使得这个问题变得相当混乱。 – jfriend00

回答

46

jQuery's map() function适合重塑数组和/或jQuery集合。

所以,给出阵列设置像这样:

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


的这一行代码是你所需要的(See it in action at jsFiddle):

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

在这个控制台所得在Firebug中显示:

jQuery(div, span, li) 


参考,也,jQuery's .toArray() function

+17

jsfiddle的例子是杀死的方式..我只投了150行代码来演示$ .map() – JBeckton

+2

也适用:'$(arrayOfJQ_Objects).map(function(){return this.get 0);});'或$(arrayOfJQ_Objects).map(function(){return this.get();});' – Renato

+1

“这一行代码就是你所需要的”,再加上其他149行代码。为什么这被接受为答案,那代码墙是可怕的。 –

-2
$('li').each(function(){ 
    $(this).doSomething(); 

})

+0

我不明白你想要与那个答案相交。 – fncomp

+0

我明白你的意思了,但你怎么知道'li's的集合与你选择的集合相同? – fncomp

+0

我在询问一组已经选中的元素,并以数组的形式存储在一个变量中,而不是如何选择一组元素并执行某些操作。 –

0

你可以做这样的事情:

var $temp = $(); 
$.each([$("li"), $("li"), $("li")], function(){ 
    $temp.push(this[0]); 
}) 

$温度所有在一个jQuery选择

元素,但我很好奇,是什么让你对这种情况有一个不同的jQuery元素的数组。你知道你可以用逗号选择不同的元素吗?像$("li, ul > li:eq(0), div")

编辑正如Guffa指出的,这只是增加了每个部分的第一个元素。 .add()是一个更好的选择,然后.push()在这里。

+0

看起来像我们有同样的想法。 – fncomp

+0

这只会得到每个jQuery对象的第一个元素,并且jQuery中没有'push'方法。 – Guffa

+0

或者OP可能想要嵌套'li'?像'$(“li li li”)'? – jackJoe

16

如果你真正的意思是如何转换:

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

到的结果:

$(a, b, c) 

那么你可以使用add函数到每个jQuery对象添加到另一个jQuery对象:

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

在这一点上,x将包含一个组合的jQuery对象,它是以前的组合a,b和c jQuery数组中的对象。

如果没有each()循环,我找不到任何方法。 add()函数接受一个DOM元素数组作为参数,但是(至少根据the documentation),不是一个jQuery对象数组。


或者,您可以使用此这将可能是一个小更有效,因为它不仅使一个新的jQuery对象结尾:

$([$(".a"), $(".b"), $(".c")].reduce(function(result, current) { return result.concat(current.get())}, [])); 
+2

'add'返回一个副本,所以这是'O(n^2)'。 –

1

编辑:我认为jQuery的支持的所有Array方法,但没有,所以这里是我的初始解决方案的工作版本,尽管它有点奇怪,因为我坚持使用相同的方法:

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

什么是'.pop()'? – meo

+0

返回并从阵列中删除最后一项。 – fncomp

+0

这只会创建一个新的数组,其中包含与旧数组完全相同的数组。 – Guffa

5

您可以使用add方法将jQuery对象中的元素复制到另一个元素中。这将从每个jQuery的对象中的所有元素复制到阵列中source到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); }); 

(在此之前1.3.2版本add方法不支持添加一个jQuery对象,所以你会需要使用items.add(this.get());代替。)

+0

有什么理由不做'var items = $()'?创建空的jQuery对象? – meo

+0

@meo:这也适用,但只适用于1.4或更高版本。 – Guffa

+0

仅供参考,此解决方案似乎只在我替换items.add(this)时才起作用; items = items.add(this);我猜测.add()不会改变它被调用的对象。 –

1

要添加单个元素:

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

到数组转换为jQuery的组元素:

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

到元件的阵列添加到现有的元素:

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

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

的点..很好的答案..谢谢你没有链接到jsfiddle中的150行js代码只是为了演示.map() – JBeckton

1

如果Array.prototype.reduce()在您的环境中受支持。

var jQueryCollection = [$("a"), $("div")] 
          .reduce(function (masterCollection, collection) { 
           return masterCollection.add(collection); 
          }, $()); 

jsFiddle

2

或者干脆$(<array of jquery elements>);

$([$("selector1"), $("selector2"), $("selector3"), ...]);

4

比接受的答案更简洁一点,可以使用$.fn.toArray传递给$.fn.map参数:

var list = [$('<a>'), $('<b>'), $('<i>')]; 

$(list).map($.fn.toArray); 

也许(这是真的很差,但只有一个函数调用你的代码):

$.fn.map.call(list, $.fn.toArray);