是否有任何将[$(div), $(span), $(li)]
转换为$(div, span, li)
的优雅方式?将jQuery元素的数组转换为jQuery包装元素集
我需要的是一组jQuery包装的元素,而不是一组jQuery元素。我想用尽可能少的代码行来做到这一点,并尽可能减少(如果有的话)循环。
编辑:对于那些被这个问题混淆,该代码被复制,并使用已经已经选择元件的阵列上的console.log从萤火虫粘贴。
是否有任何将[$(div), $(span), $(li)]
转换为$(div, span, li)
的优雅方式?将jQuery元素的数组转换为jQuery包装元素集
我需要的是一组jQuery包装的元素,而不是一组jQuery元素。我想用尽可能少的代码行来做到这一点,并尽可能减少(如果有的话)循环。
编辑:对于那些被这个问题混淆,该代码被复制,并使用已经已经选择元件的阵列上的console.log从萤火虫粘贴。
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)
你可以做这样的事情:
var $temp = $();
$.each([$("li"), $("li"), $("li")], function(){
$temp.push(this[0]);
})
$温度所有在一个jQuery选择
元素,但我很好奇,是什么让你对这种情况有一个不同的jQuery元素的数组。你知道你可以用逗号选择不同的元素吗?像$("li, ul > li:eq(0), div")
编辑正如Guffa指出的,这只是增加了每个部分的第一个元素。 .add()
是一个更好的选择,然后.push()
在这里。
如果你真正的意思是如何转换:
[$(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())}, []));
'add'返回一个副本,所以这是'O(n^2)'。 –
编辑:我认为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));
});
您可以使用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());
代替。)
要添加单个元素:
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(); }));
的点..很好的答案..谢谢你没有链接到jsfiddle中的150行js代码只是为了演示.map() – JBeckton
如果Array.prototype.reduce()
在您的环境中受支持。
var jQueryCollection = [$("a"), $("div")]
.reduce(function (masterCollection, collection) {
return masterCollection.add(collection);
}, $());
或者干脆$(<array of jquery elements>);
即$([$("selector1"), $("selector2"), $("selector3"), ...]);
比接受的答案更简洁一点,可以使用$.fn.toArray
传递给$.fn.map
参数:
var list = [$('<a>'), $('<b>'), $('<i>')];
$(list).map($.fn.toArray);
也许(这是真的很差,但只有一个函数调用你的代码):
$.fn.map.call(list, $.fn.toArray);
jQuery需要在引号之间调用元素:'$(“li”)' – jackJoe
@jackJoe我认为他直接引用了萤火虫。 – fncomp
你真的想要把这个变成:[$(a),$(b),$(c)]'到这个结果:'$(a,b,c)'?所有参数都是“li”这一事实使得这个问题变得相当混乱。 – jfriend00