Tengo una matriz con todos los elementos como cadenas. Y quiero ordenarlos alfabéticamente, así que sé que debería usar la función sort(). Pero lo que quiero que suceda es que ignorará los primeros caracteres según lo que sean.

Por ejemplo, si hay una matriz ['<FILE> dogs', '<DIR> more', '<FILE> cats'], ¿cómo haré que ignore el texto y, y ordene estas cadenas por el texto que viene después de ellas? ¿Tengo que crear una función de clasificación personalizada?

3
Marked as Duplicate 20 ago. 2017 a las 12:06

4 respuestas

La mejor respuesta

Puede quitar las etiquetas, como esta respuesta, y tomar el resto de la cadena como resultado ordenable.

var array =  ['<FILE> dogs', '<DIR> more', '<FILE> cats'];

array.sort(function (a, b) {
    function getRaw(s) {
        return s.replace(/<(?:.|\n)*?>/gm, '').trim();
    }

    return getRaw(a).localeCompare(getRaw(b));
});
console.log(array);
2
Nina Scholz 20 ago. 2017 a las 09:13

Un enfoque muy simplista podría ser;

var sorted =  ['<FILE> dogs', '<DIR> more', '<FILE> cats'].sort((a,b) => a.split(/>\s*/)[1].localeCompare(b.split(/>\s*/)[1]));
console.log(sorted);
0
Redu 20 ago. 2017 a las 12:42

Para resolver un problema como este, le aconsejaré que cree una matriz vacía, luego recorra la matriz entrante, reemplace cualquier cadena que coincida con <FILE>, <DIR> con una cadena vacía y empuje a la matriz vacía después de lo cual aplicará su orden funcionar en la nueva matriz.

0
dealwap 20 ago. 2017 a las 09:10

Puede crear su propia función de clasificación, como a continuación. En esta función, puede usar patrones regex o lo que sea para ordenar la matriz como desee. El fragmento a continuación clasifica la matriz, pero ignora el primer carácter siempre que sea una 'a'.

var arr = ["aa", "ab", "ac", "ba", "bb", "bc" ];

var removeFirstA = function (str) {
  return str[0] === "a" ? str.substr(1) : str;
};

arr.sort(function (obj1, obj2) {
  return removeFirstA(obj1).localeCompare(removeFirstA(obj2));
});

document.body.innerHTML = arr;
-1
Marco de Zeeuw 20 ago. 2017 a las 09:44