2013-02-14 12 views
18

Ho la seguente div sulla mia pagina:Come ordinare gli elementi DOM durante la selezione in jQuery?

<div id="pi_div3"> 
    Div 3 
</div> 
<div id="pi_div2"> 
    Div 2 
</div> 
<div id="pi_div1"> 
    Div 1 
</div> 
<div id="pi_div6"> 
    Div 6 
</div> 
<div id="pi_div5"> 
    Div 5 
</div> 
<div id="pi_div4"> 
    Div 4 
</div> 

sto cercando di selezionare i div che utilizzano il codice jQuery $("div[id*=pi_div]").

Ho bisogno che i div vengano ordinati in base ai loro ID quando eseguo un each() sul selettore. Quando eseguo il loop dei DIV, l'ordine dovrebbe essere: PI_DIV1, PI_DIV2, PI_DIV3, PI_DIV4, PI_DIV5, PI_DIV6. Come posso farlo in jQuery?

+0

Ordinamento * dopo *, non * durante *. 'jQuery (..)' restituisce un oggetto "array like" e un 'Array.sort' che può assumere una funzione di confronto personalizzata. –

+0

Ecco una domanda simile risolto: [how-may-i-tipo-a-list-alfabetico-con-jQuery] [1] [1]: http: // StackOverflow. it/questions/1134976/how-may-i-sort-a-list-alphabetically-using-jquery – Oliver

risposta

17

È possibile chiamare .sort() prima di chiamare .each()

$("div[id*=pi_div]").sort(function(a,b){ 
    if(a.id < b.id) { 
     return -1; 
    } else { 
     return 1; 
    } 
}).each(function() { console.log($(this).attr("id"));}); 

EDIT: Mi chiedevo perché le altre risposte stanno rimuovendo la parte pi_div dell'Es e ho capito. Se si confronta in base alle "stringhe" pi_div10 verrà prima di pi_div2.

+1

@HRK: Devi accettare la risposta di qualcun altro, il mio lavoro solo perché il numero di elementi è limitato. L'ho lasciato spiegare perché non avrebbe funzionato in generale – koopajah

+0

Questa funzione è difettosa. Confronta i valori stringa, che non creeranno il risultato corretto. – Tomalak

+0

@Tomalak> È scritto chiaramente nella risposta e ho chiesto a HRK di accettarne un altro. Volevo lasciarlo per evitare che qualcuno facesse lo stesso errore. – koopajah

1

Vorrei utilizzare il metodo Array.sort. http://jsfiddle.net/LJWrg/

var divArr = $("div[id*=pi_div]"); 
function cleanId(id) { 
    return parseInt(id.replace("pi_div",""),10); 
} 
Array.prototype.sort.call(divArr,function(a,b) { 
    return cleanId(a.id) > cleanId(b.id); 
}); 
divArr.each(function(){ 
    console.log(this.id); 
}); 

jQuery viene fornito con questo metodo definito internamente, in modo da poter ridurre a questo (comunque utilizza metodi non documentati) http://jsfiddle.net/LJWrg/1/:

var divArr = $("div[id*=pi_div]"); 
function cleanId(id) { 
    return parseInt(id.replace("pi_div",""),10); 
} 
divArr.sort(function(a,b) { 
    return cleanId(a.id) > cleanId(b.id); 
}); 
divArr.each(function(){ 
    console.log(this.id); 
}); 
6
$("div[id^=pi_div]").sort(function (a, b) { 
    return a.id.replace('pi_div', '') > b.id.replace('pi_div', ''); 
}).foo(); 

http://jsfiddle.net/KrX7t/

+0

Vale la pena notare che il metodo '.sort()' di jQuery è inteso per uso interno e non è documentato di proposito. – Blazemonger

+1

Strettamente parlando, no, non è un array, o non avrebbe bisogno di avere un metodo 'toArray()'. Ma sembra un'anatra e ciarlatano come un'anatra. – Blazemonger

+3

@Blazemonger il metodo .sort è ereditato dal metodo nativo Array.prototype.sort. Non è jQuery, è destinato ad uso esterno ed è non documentato perché non fa parte di jquery. – y3sh

5

Se voglio anche ordinarli visibilmente sulla pagina

$('div[id^="pi_div"]').sort(function (a, b) { 
    var re = /[^\d]/g; 
    return ~~a.id.replace(re, '') > ~~b.id.replace(re, ''); 
}) 
.appendTo("#container"); 

Nota il ~~ che converte i valori in numeri interi, altrimenti verrebbero confrontati come stringhe.

Vedere http://jsfiddle.net/Xjc2T/

+1

Vorrei usare 'parseInt' o semplicemente convertirli in numeri usando '+'. È un po 'più ovvio. – Blazemonger

+3

@Blazemonger Beh, hai ragione, sarebbe la stessa cosa. Comunque, '~~' gestisce anche 'undefined' e' Infinity', quindi tendo ad usarlo. – Tomalak

+1

Grazie per l'aggiunta di '.appendTo ('# contenitore')' che aggiorna l'ordinamento degli elementi nel DOM tre. –

Problemi correlati