Tengo una matriz alfanumérica que necesito ordenar por orden alfabético ascendente y luego por número descendente, la matriz es la siguiente:
[A1, A4, A2, A3, C2, C4, C3, B3, B5, B4]¿Cómo clasifico la matriz usando JavaScript, para que se vea así:
[A4, A3, A2, A1, B5, B4, B3, C4, C3, C2]Yo he tratado:
arr.sort()pero eso solo lo ordena alfabética y numéricamente ascendente, dándome:
[A1, A2, A3, A4, B3, B4, B5, C2, C3, C4]Si siempre tiene una sola letra, puede ordenar por el resto numérico y por la primera letra.
const array = ['A1', 'A4', 'A2', 'A3', 'C2', 'C4', 'C3', 'B3', 'B5', 'B4']; array.sort((a, b) => a[0].localeCompare(b[0]) || b.slice(1) - a.slice(1)); console.log(...array);Si tiene más de una letra, puede tomar una expresión regular y obtener solo dígitos y no dígitos, separados en un objeto.
const getValues = string => ({ letters: string.match(/\D+/)[0], digits: string.match(/\d+/)[0] }), array = ['A1', 'A4', 'A2', 'A3', 'C2', 'C4', 'C3', 'B3', 'B5', 'B4']; array.sort((a, b) => { const [aa, bb] = [a, b].map(getValues); return aa.letters.localeCompare(bb.letters) || bb.digits - aa.digits; }); console.log(...array);array.sort toma una devolución de llamada donde puede definir la condición sobre cómo compara dos elementos en su matriz
para realizar su necesidad, una idea puede ser devolver la comparación del segundo carácter si el primero es idéntico
var data = ['A1', 'A4', 'A2', 'A3', 'C2', 'C4', 'C3', 'B3', 'B5', 'B4']; var result = data.sort((a, b) => { if (a === b) { return 0; } if (a[0] === b[0]) { return (a[1] > b[1]) ? -1 : 1; } return (a > b) ? 1 : -1; }); console.log(result);