2013-03-11 37 views
1

假設我有一個結構,像這樣:你能找到屬性w的不同值的數量嗎? jQuery的?

<div class='collection'> 
    <div class='item' seq=1>foo</div> 
    <div class='item' seq=2>bar</div> 
    <div class='item' seq=2>baz</div> 
    <div class='item' seq=2>asd</div> 
    <div class='item' seq=3>que</div> 
    <div class='item' seq=3>bletch</div> 
</div> 

可以很容易地獲得與SEQ = 1,SEQ = 2等,但如何的項目數,你會發現序列的不同值的數量,以及這些價值是什麼?假設seq的值將從1開始並且增加1直到沒有更多值,這可能是安全的。

+3

要建立有效的HTML你應該使用像'data-seq ='「''這樣的'data-*'屬性。 – insertusernamehere 2013-03-11 15:42:20

+0

有用;謝謝! – 2013-03-11 15:49:31

回答

5

可以積累在一個對象的屬性值和它們的計數:

var totals = {}; 
$(".collection > .item").each(function() { 
    var seq = $(this).attr("seq"); 
    var total = totals[seq] || 0; 
    totals[seq] = total + 1; 
}); 

當上面的代碼運行,你應該有一個對象,如:

{ 
    "1": 1, 
    "2": 3, 
    "3": 2 
} 
+0

+1,因爲它比Darren的答案更高效:) – 2013-03-11 15:47:45

+0

@ClementHerreman但不易讀的IMO – 2013-03-11 15:50:52

+1

如果可能'seq'屬性不存在,您可以稍微過濾一下:'「.collection> .item [seq] 「'。這樣你就可以避免將一個「undefined」作爲你的關鍵之一。除非你想要。 – 2013-03-11 15:52:12

1

你可以這樣做:

var items = []; 
$(".collection > .item").each(function() { 
    var sequence = $(this).attr("seq"); 
    if (jQuery.inArray(sequence, items) == -1) { 
     items.push(sequence); 
    } 
}); 

這聲明數組稱爲項目和循環圓每個格。如果序列不在數組中,則會添加序列值。

+0

不應該是'$(「。item」)'而不是'$(「。collection」)'? – insertusernamehere 2013-03-11 15:51:47

+1

@insertusernamehere - 是的好點。我添加了.collection> .item,因爲它是colleciton的後裔。 – 2013-03-11 15:54:38