2011-08-02 28 views
18

Hay un montón de ejemplos para la clasificación de alguna matriz JSON por alguna propiedad (es decir, 'título') Estamos utilizando la función como éste compara:Javascript género con Unicode

function sortComparer(a, b) { 
     if (a.title == b.title) 
      return 0; 
     return a1 > b1 ? 1 : -1; 
    } 

problema es que alfabeto latino serbio el orden se parece a "A, B, C, Č, D, D, ..." Al usar sortComparer anterior, estoy ordenando D antes de "Č" o "Ć". ¿Alguna idea de cómo clasificar respetando el lenguaje cultural actual?

+0

Una forma sería la de sustituir los otros personajes con sus equivalentes ASCII. –

+0

No estoy seguro de lo que piensas. La única forma en que me estoy preguntando es definir un conjunto de letras como: var letras = {'a', 'b', 'c', 'č', 'ć', ...} y en la función sortComparer comparar índices . La desventaja de este enfoque es que tenemos que escribir dicha matriz para cada cultura que no sea en inglés. –

+1

Javascript no es compatible con el Algoritmo de intercalación Unicode, por lo que básicamente es una manguera. No puede usar una clasificación de punto de código y obtener cualquier cosa razonable. Para obtener un orden alfabético, necesita el UCA. – tchrist

Respuesta

22

Si el entorno local en su sistema está configurado correctamente, puede utilizar localeCompare método en lugar de mayor que operador para comparar las cadenas - este método conoce la configuración regional.

function sortComparer(a,b){ 
    return a.title.localeCompare(b.title) 
}; 
+2

Esto funcionará solo si la configuración regional está establecida.¿Algún método para pasar cultura junto con el valor comparado? –

+0

No hay forma de establecer la configuración regional por script, ya que está definida por el navegador o, dependiendo del navegador, heredado del sistema operativo. – Andris

+3

He encontrado una solución completa aquí http://stackoverflow.com/questions/3630645/how-to-compare-utf-8-strings-in-javascript –

1

Ha intentado localeCompare() función de la secuencia:

function sortComparer(a, b) { 
    return a.title.localeCompare(b.title); 
} 

responsabilidad: no he hecho probado para ver qué localeCompare() hace con esos caracteres no ingleses, y MDN no dice tampoco. (Sí dice que toLocaleLowerCase() aspectos, la localización actual, por lo que es de esperar que localeCompare() sería la misma, pero aún así ...)

0

Para ordenar una matriz con ajuste personalizado haz lo siguiente:

  1. crear una matriz con una orden de encargo de alfabetos:

    var alphabets = ["A", "B", "C", "Č", "Ć", "D","Dž","Đ","E","F","G","H","I","J","K","L","Lj","M","N","Nj","O","P","R","S", "ÛŒ","T","U","V","Z","Ž"];

  2. Crear una lista de prueba matriz:

    var testArrray = ["B2","D6","A1","Ć5","Č4","C3"];

  3. Crear un nombre de función para ordenar:

    function OrderFunc(){ 
          testArrray.sort(function (a, b) { 
           return CharCompare(a, b, 0); 
          }); 
         } 
    
  4. crear la función CharCompare (índice: tipo "AAAB" antes "AAAC"):

    function CharCompare(a, b, index) { 
        if (index == a.length || index == b.length) 
         return 0; 
        //toUpperCase: isn't case sensitive 
        var aChar = alphabets.indexOf(a.toUpperCase().charAt(index)); 
        var bChar = alphabets.indexOf(b.toUpperCase().charAt(index)); 
        if (aChar != bChar) 
         return aChar - bChar 
        else 
         return CharCompare(a,b,index+1) 
    

    }

  5. Call OrderFunc para clasificar el testArray (el resultado será: A1, B2, C3, Č4, Ć5, D6).

Test Online

buena suerte

+0

@TheChetan. esta es una función de orden personalizada y puede administrar todos los alfabetos que va a ordenar. por ejemplo, el alfabeto ruso tiene 33 caracteres, el persa tiene 32 caracteres y así sucesivamente. –

Cuestiones relacionadas