2011-07-12 11 views
17

Estoy buscando una función que tome una lista de opciones en una lista de selección y las ordene alfabéticamente pero con un giro. Todos los valores con el texto 'NA' deben colocarse al final de la lista.Opciones de ordenamiento en una lista de selección con javascript/jQuery ... pero no alfabéticamente

Así da una lista -

<select> 
    <option value="1">Car</option> 
    <option value="2">Bus</option> 
    <option value="3">NA</option> 
    <option value="4">Bike</option> 
    <option value="5">Tractor</option> 
    <option value="6">NA</option> 
</select> 

Debemos terminar con -

<select> 
    <option value="4">Bike</option> 
    <option value="2">Bus</option> 
    <option value="1">Car</option> 
    <option value="5">Tractor</option> 
    <option value="3">NA</option> 
    <option value="6">NA</option> 
</select> 

El orden de las AN no es importante.

Y no pregunte por qué No puedo quitar las AN (o por qué habrá varias opciones con los mismos textos, pero diferentes valores subyacentes, porque no estoy de acuerdo con ella tampoco.

+0

Vale la pena señalar para todas estas respuestas: la ordenación cambiará qué opción está seleccionada. Debe persistir el valor del elemento de selección antes del ordenamiento y restaurarlo después. –

Respuesta

45

demo: http://jsfiddle.net/4bvVz/

function NASort(a, b) {  
    if (a.innerHTML == 'NA') { 
     return 1; 
    } 
    else if (b.innerHTML == 'NA') { 
     return -1; 
    }  
    return (a.innerHTML > b.innerHTML) ? 1 : -1; 
}; 

$('select option').sort(NASort).appendTo('select'); 
+0

Marcado como respuesta como se publicó primero .. plus tiene la demostración. Brillante, gracias. – glosrob

+0

Parece un desperdicio no publicar después de trabajar en ello durante aproximadamente 5 minutos. – kei

+0

@glosrob cwolves publicado realmente primero – kei

16
var sb = $('select'); 

sb.append(sb.find('option').sort(function(a, b){ 
    return (
     a = $(a).text(), 
     b = $(b).text(), 
     a == 'NA' ? 1 : b == 'NA' ? -1 : 0|a > b 
    ); 
})); 
1

Si usted tiene más de un seleccione en la página (múltiples selecciona) el uso de esta :

function NASort(a, b) { 
    if (a.innerHTML == 'NA') { 
     return 1; 
    } 
    else if (b.innerHTML == 'NA') { 
     return -1; 
    } 
    return (a.innerHTML > b.innerHTML) ? 1 : -1; 
}; 

$('select').each(function(index) { 
    $(this).find('option').sort(NASort).appendTo($(this)); 
}); 
1

He realizado algunos cambios a la función original y funcionó bien.

function NASort(a, b) { 
    console.log(a.innerHTML.substr(0, 1).toLowerCase() + ' > ' + b.innerHTML.substr(0, 1).toLowerCase()); 
    return (a.innerHTML.substr(0, 1).toLowerCase() > b.innerHTML.substr(0, 1).toLowerCase()) ? 1 : -1; 
}; 

$('select option').sort(NASort).appendTo('select'); 
Cuestiones relacionadas