Estoy tratando de organizar los valores dados en orden ascendente
const value = [ { val: "11-1" }, { val: "12-1b" }, { val: "12-1a" }, { val: "12-700" }, { val: "12-7" }, { val: "12-8" }, ];Estoy usando el siguiente código para ordenar esto en orden ascendente:
value.sort((a,b)=>(a.val >b.val)? 1:((b.val>a.val)?-1:0)); El resultado de este tipo está en el orden 11-1,12-1a, 12-1b, 12-7, 12-700, 12-8 . Sin embargo, quiero que el orden sea 11-1,12-1a, 12-1b, 12-7, 12-8, 12-700 .
¿Cómo puedo lograr eso?
Si solo está interesado en ordenar por el valor después del guión, puede lograrlo con este código:
const value = [ {val:'12-1'}, {val:'12-700'}, {val:'12-7'}, {val:'12-8'}, ]; const sorted = value.sort((a,b) => { const anum = parseInt(a.val.split('-')[1]); const bnum = parseInt(b.val.split('-')[1]); return anum - bnum; }); console.log(sorted);actualizó la respuesta a medida que su pregunta se actualiza aquí está la solución para esto:
const value = [{ val: '11-1' }, { val: '12-1b' }, { val: '12-1a' }, { val: '12-700' }, { val: '12-7' }, { val: '12-8' }]; const sortAlphaNum = (a, b) => a.val.localeCompare(b.val, 'en', { numeric: true }); console.log(value.sort(sortAlphaNum));Si desea verificar diferentes valores tanto antes como después del guión e incluir la verificación de letras, la solución al final resolverá esto.
Esto es lo que hice:
Creó una expresión regular para dividir los caracteres por tipo:
var regexValueSplit = /(\d+)([az]+)?-(\d+)([az]+)?/gi;Creó una función de comparación para tener en cuenta números y letras:
function compareTypes(alpha, bravo) { if (!isNaN(alpha) && !isNaN(bravo)) { return parseInt(alpha) - parseInt(bravo); } return alpha > bravo; } Divida los valores según regexValueSplit :
value.sort((a, b) => { let valuesA = a.val.split(regexValueSplit); let valuesB = b.val.split(regexValueSplit);Esto produce los siguientes resultados (cadena de ejemplo "12-1a"):
[ "", "12", null, "1", "a", "" ] Luego, dado que todas las matrices divididas deben tener la misma longitud, compare cada valor en un bucle for :
for (let i = 0; i < valuesA.length; i++) { if (valuesA[i] !== valuesB[i]) { return compareTypes(valuesA[i], valuesB[i]); } } // Return 0 if all values are equal return 0; const value = [{ val: "11-1" }, { val: "12-1b" }, { val: "12-1a" }, { val: "12-700" }, { val: "12-7" }, { val: "12-8" }, ]; var regexValueSplit = /(\d+)([az]+)?-(\d+)([az]+)?/gi; function compareTypes(alpha, bravo) { if (!isNaN(alpha) && !isNaN(bravo)) { return parseInt(alpha) - parseInt(bravo); } return alpha > bravo; } value.sort((a, b) => { let valuesA = a.val.split(regexValueSplit); let valuesB = b.val.split(regexValueSplit); for (let i = 0; i < valuesA.length; i++) { if (valuesA[i] !== valuesB[i]) { return compareTypes(valuesA[i], valuesB[i]); } } return 0; }); console.log(JSON.stringify(value, null, 2));