2014-01-16 40 views
1

比方說,我有一個像元素的列表:通過其索引得到一組任意元素的

<ul> 
    <li>a</li> 
    <li>b</li> 
    <li>c</li> 
    <li>d</li> 
    <li>e</li> 
    <li>f</li> 
    <li>g</li> 
    <li>h</li> 
    <li>i</li> 
    <li>j</li> 
</ul> 

我有一個這樣的數組:[ 2, 5, 6 ]

(這兩個元素的列表,該陣列可以是相當巨大的,但讓我們保持簡單)

我如何使用jQuery有效地挑選與這些要素相應的元素? (在這種情況下,將包含cfg和列表元素)

的一種方法將是使用一個jQuery each()並搜索數組中的索引。但是這需要在每次迭代時對數組進行線性搜索,並且沒有完全優化。

另一種方法是使用eq()選擇器或eq()函數傳遞一個索引。但是接下來我必須對每個數組元素重複這個過程,但這也不是很有效。不幸的是eq()沒有得到一個數組作爲參數。

另一種方法是編寫一個jQuery插件,但似乎對於這樣一個小問題太多的工作。

你知道更好的工作方式嗎?

+1

如何通過使用'var childrens = $(「ul」)獲取所有'li'列表。 ;''然後你可以通過'alert(childrens [index])'索引來引用它' –

+1

某些東西將不得不遍歷你的數組並抓取每個DOM元素,這個DOM元素對應於數組中每個元素的數字。 jQuery沒有內置的方法來做到這一點。所以,給自己寫一個小功能來自己做。你可以使它成爲一個util函數或一個jQuery插件 - 你的選擇。 – jfriend00

回答

4
var $result = $([]); // Empty jQuery object 
var $lis = $("li"); 
for (var i = 0; i < array.length; i++) { 
    $result = $result.add($lis.eq(array[i])); 
}; 
+0

你可能已經改變爲'$ result = $ result.add($ lis [array [i]]);' –

+0

謝謝,你是對的。 – Barmar

2

您可以對items數組執行indexOf操作,查看是否存在位於的索引idx的項目。

var $listitems = $("<ul><li>a</li><li>b</li><li>c</li><li>d</li><li>e</li><li>f</li><li>g</li><li>h</li><li>i</li><li>j</li></ul>").find("li");//jQuery object of all the list items 
var items = [ 2, 5, 6 ]; 

var $filtered = $listitems.filter(function(val, idx) { 
    return $.inArray(items, idx) !== -1; 
}); 

你提到的項目可能會很大,因此它可能是更好的items轉換爲對象

var itemHash = items.reduce(function(memo, item) { 
    memo[item] = true; 
    return memo; 
}, {}); 
var $filtered = $listitems.filter(function(val, idx) { 
    return itemHash[idx] !== undefined; 
}); 
1

您可以使用

$("ul li").eq(0) will give you the first element. 

使用下面的腳本

narray = new Array(5,6,7); 
     for (i=0;i< narray.length;i++){ 
     $("ul li").eq(narray[i]).html('hello') //for that corresponding element 
    } 

你必須使用數組來獲取元素,因爲這是迭代工作