是否有任何將[$(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