2011-07-28 187 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);