tengo una matriz como esta
["1","0K","11",1,"KE","PQ",5,"5"]donde quiero que ordene primero por texto y luego por número como a continuación
["KE","PQ","0K","1",1,5,"5","11"] Usé local compare pero no parecía estar funcionando.
function desc(a,b){ //below is the code that needs improvement return b.toString().localeCompare(a, undefined, { numeric: true, sensitivity: "base", }); } function sort(order) { return order === "desc" ? (a, b) => desc(a, b) : (a, b) => -desc(a, b); } function stableSort(array, cmp){ const stabilizedThis = array.map((el, index) => [el, index]); stabilizedThis.sort((a, b) => { const order = cmp(a[0], b[0]); if (order !== 0) return order; return (a[1]) - (b[1]); }); return stabilizedThis.map((el) => el[0]); } var arr = ["1","0K","11",1,"KE","PQ",5,"5"]; console.log(stableSort(arr, sort("asc"))) var arr = ["1","OK","11",1,"KE","PQ",5,"5"] var wordArr = [] var numArr = [] arr.forEach((el) => { if(Number(el)){ numArr.push(el) } else { wordArr.push(el) } }); wordArr.sort() numArr.sort((a, b) => a - b) arr = wordArr.concat(numArr) console.log(arr)Puede escribir métodos de filter para obtener las strings containing numbers , eliminar las entradas, obtener numbers y strings por separado del rest y luego ordenarlos de la forma que desee.
const data = ["1","0K","11",1,"KE","PQ",5,"5"]; const stringsWithNumbers = data.filter(x => /\d+[a-zA-Z]/.test(x)); const rest = data.filter(x => !stringsWithNumbers.includes(x)); const numbers = rest.filter((x) => parseInt(x, 10)); const words = rest.filter((x) => !parseInt(x, 10)); const result = [ ...words.sort((a, b) => a.localeCompare(b)), ...stringsWithNumbers.concat(numbers).sort((a, b) => parseInt(a) - parseInt(b)), ]; console.log(result); const sort = (arr = []) => { const nonAlpha = /[^a-zA-Z]/g, nonNum = /[^0-9]/g; return arr.sort((a, b) => { const aStr = String(a), bStr = String(b); const aAlpha = aStr.replace(nonAlpha, ""), bAlpha = bStr.replace(nonAlpha, ""); const alphaCompare = bAlpha.localeCompare(aAlpha); if(alphaCompare) return alphaCompare; const aNum = +aStr.replace(nonNum, ""), bNum = +bStr.replace(nonNum, ""); return aNum - bNum; }); } console.log( sort(["1","0K","11",1,"KE","PQ",5,"5"]) );