2013-01-04 16 views
41

Mam wiele elementów z atrybutem: data-percentage, czy istnieje sposób sortowania elementów w kolejności rosnącej z najniższą wartością jako pierwszą?Sortuj element według wartości liczbowej atrybutu danych

HTML:

<div class="testWrapper"> 
    <div class="test" data-percentage="30"> 
    <div class="test" data-percentage="62"> 
    <div class="test" data-percentage="11"> 
    <div class="test" data-percentage="43"> 
    </div> 

Pożądany wynik: HTML:

<div class="testWrapper"> 
    <div class="test" data-percentage="11"> 
    <div class="test" data-percentage="30"> 
    <div class="test" data-percentage="43"> 
    <div class="test" data-percentage="62"> 
    </div> 

przy użyciu JavaScript lub jQuery?

+0

Czy masz div owijania wokół tych div? – sp00m

+0

Tak, jest - zaktualizowałem pytanie, które należy uwzględnić. – JayDee

Odpowiedz

98

Zastosowanie Array.sort:

var $wrapper = $('.testWrapper'); 

$wrapper.find('.test').sort(function(a, b) { 
    return +a.dataset.percentage - +b.dataset.percentage; 
}) 
.appendTo($wrapper); 

Oto skrzypce: http://jsfiddle.net/UdvDD/


Jeśli używasz IE < 10, nie można użyć właściwości dataset. Użyj getAttribute zamiast:

var $wrapper = $('.testWrapper'); 

$wrapper.find('.test').sort(function(a, b) { 
    return +a.getAttribute('data-percentage') - +b.getAttribute('data-percentage'); 
}) 
.appendTo($wrapper); 

Oto skrzypce: http://jsfiddle.net/UdvDD/1/

+1

Nie potrzebujesz * tutaj unarnego plusa, ponieważ '-' zamieni oba operandy na liczby. Sprawia jednak, że rzeczy są wyraźniejsze. –

+7

@FelixKling - Nienawidzę ukrytego przesyłania. Jeśli robię matematykę, lubię bezpośrednio zajmować się liczbami. –

+0

jQuery.data jest twoim przyjacielem –

1

myślę, że plugin Tinysort Jquery powinna być opcja, można dostać się I tutaj: http://tinysort.sjeiti.com/

nie próbował go jednak kod powinien wyglądać tak:

$("#test > div").tsort("",{attr:"data-percentage"}); 

nadzieję, że pomoże

+1

Nie ma potrzeby, aby ten pierwszy pusty ciąg argumentów. Wystarczy przekazać obiekt jako jedyny argument. –

5
$('.testWrapper').find('.test').sort(function (a, b) { 
    return $(a).attr('data-percentage') - $(b).attr('data-percentage'); 
}) 
.appendTo('.testWrapper'); 
+0

Gilber Mam jedno pytanie, jeśli div nie ma "danych procentowych" Chcę iść na ostatnie miejsce, czy to możliwe? Dzięki. – diank

0

Ta bardziej funkcjonalna opcja pozwala na sortowanie elementów w oparciu o wiele opcji.

https://jsfiddle.net/L3rv3y7a/1/

// This calls the function 
DOYPSort('#wrapper', '.element', value, order); 

    // Parameters must be strings 
    // Order of must be either 'H' (Highest) or 'L' (Lowest) 
    function DOYPSort(wrapper, elementtosort, AttrToSort, orderof) { 
     $(wrapper).find(elementtosort).sort(function (a, b) { 
      if (orderof === 'H') { 
       return +b.getAttribute(AttrToSort) - +a.getAttribute(AttrToSort); 
      } 
      if (orderof === 'L') { 
       return +a.getAttribute(AttrToSort) - +b.getAttribute(AttrToSort); 
      } 
     }).appendTo(wrapper); 
    } 
Powiązane problemy