Hola estoy enfrentando un problema.
Quiero ordenar mi tabla por decimal y luego por letra.
Por ejemplo tengo esto:
5.3 Choice 3 A-Choice 4 1.2 Choice 1 1.5 Choice 2 C-Choice 5Y quiero que sea así:
1.2 Choice 1 1.5 Choice 2 5.3 Choice 3 A-Choice 4 C-Choice 5Probé algo así
const compare = (a, b) => { if (!isNaN(b.label.charAt(0))) { if (a.label === b.label) { return 0 }; const aArr = a.label.split("."), bArr = b.label.split("."); for (let i = 0; i < Math.min(aArr.length, bArr.length); i++) { if (parseInt(aArr[i]) < parseInt(bArr[i])) { return -1 }; if (parseInt(aArr[i]) > parseInt(bArr[i])) { return 1 }; } if (aArr.length < bArr.length) { return -1 }; if (aArr.length > bArr.length) { return 1 }; return 0; } else { return a.label > b.label; } }; processus.sort(compare);Pero no funciona... Gracias.
Pruebe la clasificación mediante la comparación de cadenas (ic localeCompare ).
localeCompare no es suficiente si los valores después de 'Choice' pueden ser > 9 (p. ej '1.2 Choice 23' . En ese caso, deberá ordenar dos veces, algo así como el fragmento.
const toSort = getToSort(); log(`\n**Choice always [< 10], localeCompare sufficient`, toSort.simple .sort((a, b) => a.localeCompare(b)) .join(`\n`) ); // this does not work for a choice values > 9 log(`\n**Choice may be [> 9], localeCompare insufficient`, toSort.complex .sort((a, b) => a.localeCompare(b)) .join(`\n`) ); // so, [Choice > 9] needs more work // The plan: // 1. Sort on string start (eg '1.2', 'C'), create // an Object from that with key = string start, // values = [next values] and convert it to an // Array of entries; // 2. Sort numeric within the entries Array on the // last value ('Choice [value]'), which is already // converted to number. Remap the result to sorted // strings. const linesSorted = Object.entries(toSort.complex /*1*/ .map(v => v.split(/[\s-]/)) .sort(([a, , ], [b, , ]) => a.localeCompare(b)) .reduce( (acc, [v1, v2, v3]) => ({ ...acc, [v1]: [...(acc[v1] || []), [v2, +v3]]}), {} ) ) .reduce( (acc, [key, value]) => /*2*/ [...acc, [key, value.sort(([, a], [, b]) => a - b, [] ).map(v => `${key} ${v.join(` `)}`)]], []) .map(([, value]) => value.join(`\n`)) .join(`\n`); log(`\n**Choice may be [> 9], need more work`, linesSorted); // helpers function getToSort() { // return strings to sort, already splitted to array return { simple: `5.3 Choice 3 A-Choice 4 1.2 Choice 1 1.5 Choice 2 C-Choice 5`.split(`\n`).map(v => v.trim()), complex: `1.5 Choice 3 5.3 Choice 3 1.2 Choice 55 A-Choice 4 1.2 Choice 1 1.5 Choice 11 C-Choice 5 A-Choice 110 1.2 Choice 2`.split(`\n`).map(v => v.trim()) }; } function log(...strs) { const pre = document.querySelector(`pre`); strs.forEach(str => pre.textContent += `${str}\n`); } <pre></pre>Esto se puede lograr fácilmente con localeCompare .
const arr = [ '5.3 Choice 3', 'A-Choice 4', '1.2 Choice 1', '1.5 Choice 2', 'C-Choice 5', ]; const result = arr.sort((a, b) => a.localeCompare(b)); console.log(result);