Estoy trabajando en una función de JavaScript (jQuery también está bien si esto lo necesita, pero dudo que lo haga) para ordenar alfabéticamente una cadena de letras. Digamos que la cadena que quiero ordenar es: "ACBacb".
Mi código a partir de ahora es este:
var string='ACBacb'; alert(string.split('').sort().join(''));Esto devuelve ABCabc. Puedo ver por qué sucede eso, pero ese no es el formato que estoy buscando. ¿Hay alguna manera de ordenarlo poniendo las mismas letras una al lado de la otra, la mayúscula primero? Entonces, cuando pongo ACBacb, ¿obtengo AaBbCc?
Array.sort puede tener una función de clasificación como argumento opcional.
¿Qué hay de ordenar la cadena primero (ACBacbA se convierte en AABCabc) y luego ordenarla sin distinguir entre mayúsculas y minúsculas?
function case_insensitive_comp(strA, strB) { return strA.toLowerCase().localeCompare(strB.toLowerCase()); } var str = 'ACBacbA'; // split the string in chunks str = str.split(""); // sorting str = str.sort(); str = str.sort( case_insensitive_comp ) // concatenate the chunks in one string str = str.join(""); alert(str);Según la sugerencia de Felix, la primera función de clasificación se puede omitir y fusionar en la segunda. Primero, haga una comparación sin distinción entre mayúsculas y minúsculas entre ambos caracteres. Si son iguales, verifique sus equivalentes que distinguen entre mayúsculas y minúsculas. Devuelve -1 o 1 para diferencia y cero para igualdad.
function compare(strA, strB) { var icmp = strA.toLowerCase().localeCompare(strB.toLowerCase()); if (icmp != 0) { // spotted a difference when considering the locale return icmp; } // no difference found when considering locale, let's see whether // capitalization matters if (strA > strB) { return 1; } else if (strA < strB) { return -1; } else { // the characters are equal. return 0; } } var str = 'ACBacbA'; str = str.split(''); str = str.sort( compare ); str = str.join('');Puede pasar una función de comparación personalizada a Array.sort()
Las respuestas ya dadas son correctas hasta ahora que debe usar una función de comparación personalizada. Sin embargo, debe agregar un paso adicional para ordenar las letras mayúsculas antes que las minúsculas una vez:
function cmp(x,y) { if(x.toLowerCase() !== y.toLowerCase()) { x = x.toLowerCase(); y = y.toLowerCase(); } return x > y ? 1 : (x < y ? -1 : 0); // or return x.localeCompare(y); }Si las letras son iguales, hay que comparar los originales, no las minúsculas. La letra mayúscula siempre es "más grande" que la versión minúscula.
DEMO (basado en la versión de @Matt Ball )
un ejemplo de trabajo http://jsfiddle.net/uGwZ3/
var string='ACBacb'; alert(string.split('').sort(caseInsensitiveSort).join('')); function caseInsensitiveSort(a, b) { var ret = 0; a = a.toLowerCase();b = b.toLowerCase(); if(a > b) ret = 1; if(a < b) ret = -1; return ret; }