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

Sco*_*eld 50 jquery

是否有任何优雅的方式[$(div), $(span), $(li)]变成$(div, span, li)

我需要的是一个jQuery包装的元素集,而不是jQuery元素的数组.我想在尽可能少的代码行中执行此操作,并使用最少的(如果有的话)循环.

编辑: 对于那些对此问题感到困惑的人,此代码将使用console.log从已选择的元素数组中复制并粘贴到firebug中.

Bro*_*ams 48

jQuery的map()功能非常适合重塑数组和/或jQuery集合.

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

var arrayOfJQ_Objects = [$("div"), $("span"), $("li")];
Run Code Online (Sandbox Code Playgroud)


这一行代码就是您所需要的(在jsFiddle中查看它):

$(arrayOfJQ_Objects).map (function () {return this.toArray(); } );
Run Code Online (Sandbox Code Playgroud)

导致Firebug中的此控制台显示:

jQuery(div, span, li)
Run Code Online (Sandbox Code Playgroud)


另外,参考jQuery的.toArray()功能.

  • 这个jsfiddle的例子就是杀了..我只是为150行代码投票来演示$ .map() (19认同)
  • 也适用:`$(arrayOfJQ_Objects).map(function(){return this.get(0);});`或`$(arrayOfJQ_Objects).map(function(){return this.get();}); ` (2认同)

jfr*_*d00 17

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

[$(a), $(b), $(c)]
Run Code Online (Sandbox Code Playgroud)

进入结果:

$(a, b, c)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用add函数将每个jQuery对象添加到另一个jQuery对象:

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

此时,x将包含一个组合的jQuery对象,它是数组中先前的a,b和c jQuery对象的组合.

没有each()循环,我找不到任何办法.该add()函数接受一个DOM元素数组作为参数,但(至少根据文档),而不是jQuery对象的数组.


或者,您可以使用这可能会更高效,因为它最后只生成一个新的jQuery对象:

$([$(".a"), $(".b"), $(".c")].map(function(o) { return o.get() }));
Run Code Online (Sandbox Code Playgroud)

  • `add`返回一个副本,所以这是'O(n ^ 2)`. (3认同)

小智 6

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

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

$(list).map($.fn.toArray);
Run Code Online (Sandbox Code Playgroud)

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

$.fn.map.call(list, $.fn.toArray);
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 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); });
Run Code Online (Sandbox Code Playgroud)

(在1.3.2版之前,该add方法不支持添加jQuery对象,因此您需要使用它items.add(this.get());.)