簡體   English   中英

javascript 按包含字母和數字的字符串對對象列表進行排序

[英]javascript sort list of objects by string containing letters and numbers

我正在嘗試按字符串對對象列表進行排序,該字符串是歌曲的文件名,有時文件名包含數字和字母,但我嘗試過的每種排序方法都不會按照您期望的順序對文件名進行排序,例如在我下面的示例中,預期的 output 是:

Track 1
Track 2
Track 10

但它被錯誤地排序為:

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)

將字符串與textA < textB進行比較會根據每個字符的詞典順序給出結果 - 在這種情況下1 10 2是正確的順序。 比較數字的差異而不是進行字符串比較,為此您只需提取字符串的數字部分。 -可以使用,它將首先將每一邊轉換為數字。

 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);

如果您設置numeric選項String#localeCompare可以為您處理數字。 請記住檢查當前瀏覽器是否支持options ,如果不支持則回退到像CertainPerformance's answer這樣的方法。

 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM