将jQuery元素的数组转换为jQuery包装元素集

有没有把[$(div), $(span), $(li)]转换成$(div, span, li)优雅方法?

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

编辑:对于你这个问题感到困惑的人,这个代码是从已经被选中的元素数组上使用console.log从firebug复制和粘贴的。

jQuery的map()函数非常适合重塑数组和/或jQuery集合。

所以, 给定一个数组像这样:

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

这一行代码就是你所需要的( 在jsFiddle中看到它的作用 ):

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

在Firebug中产生这个控制台显示:

 jQuery(div, span, li) 

引用,也是jQuery的.toArray()函数 。

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

 [$(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元素数组作为参数,但是(至less根据文档 ),不是一个jQuery对象数组。


或者,你可以使用这可能会更有效一些,因为它只是最后一个新的jQuery对象:

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

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

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

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

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

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

或者简单的$( <array of jquery elements> );

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

编辑 :我以为jQuery支持所有的Array方法,但不,所以这是我的初始解决scheme的工作版本,虽然有点奇怪,因为我坚持相同的方法:

 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)); }); 

要添加单个元素:

 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(); } )); 

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

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

jsFiddle 。

你可以做这样的事情:

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

$ temp在一个jQueryselect器中的所有元素

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

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

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

})