Estoy tratando de ordenar una lista de objetos por una cadena que es el nombre de archivo de una canción, a veces el nombre de archivo incluye números y letras, pero todos los métodos de clasificación que he probado no ordenan los nombres de archivo en el orden esperado, como como en mi ejemplo a continuación, el resultado esperado es:
Track 1 Track 2 Track 10pero se ordena incorrectamente como:
Track 1 Track 10 Track 2 var inputFiles=[ { 'name':'Track 1.wav' }, { 'name':'Track 2.wav' }, { 'name':'Track 10.wav' }, ] console.log('sort audio files by title: ', inputFiles) let sortedAudio = inputFiles.sort(function(a, b) { var textA = a['name'].toUpperCase(); var textB = b['name'].toUpperCase(); return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; }); console.log('sortedAudio=',sortedAudio)La comparación de cadenas con textA < textB le dará resultados de acuerdo con el orden lexiográfico de cada carácter, en cuyo caso 1 10 2 es el orden correcto. Compare las diferencias de los números en lugar de hacer una comparación de cadenas, para lo cual tendrá que extraer solo la parte numérica de la cadena. - se puede usar, que convertirá cada lado en un número primero.
var inputFiles = [{ 'name': 'Track 1.wav' }, { 'name': 'Track 2.wav' }, { 'name': 'Track 10.wav' }, ] console.log('sort audio files by title: ', inputFiles); inputFiles.sort((a, b) => a.name.match(/\d+/)[0] - b.name.match(/\d+/)[0]); console.log('sortedAudio=', inputFiles);String#localeCompare puede manejar números por usted si establece la opción numeric . Recuerde verificar si el navegador actual admite options y recurra a un enfoque como la respuesta de CertainPerformance si no lo hace.
var inputFiles = [ { 'name': 'Track 10.wav' }, { 'name': 'Track 1.wav' }, { 'name': 'Track 2.wav' }, { 'name': 'Track 7.wav' }, { 'name': 'Unknown Track.wav' }, { 'name': 'Track 4.wav' }, { 'name': 'Track 100.wav' }, { 'name': 'Track 13.wav' }, { 'name': 'Track 20.wav' }, { 'name': 'Unknown Track.wav' } ]; const sortedAudio = inputFiles.sort((a,b) => a.name.localeCompare(b.name, undefined, { numeric: true })); console.log('sortedAudio: ', sortedAudio);