简体   繁体   English

按两个值按降序对数组中的对象进行排序

[英]Sorting objects from an array by two values in descending order

I'm dealing with the iTunes API and pulling songs from albums. 我正在处理iTunes API并从专辑中提取歌曲。 I'm trying to sort songs in by their track number and according to what disc they belong to but seem to be running into a few issues. 我正在尝试按照歌曲的曲目号和它们所属的光盘对歌曲进行排序,但似乎遇到了一些问题。 For one the order of the discs is in reverse order. 对于一张光盘,其顺序是相反的。 Second, its not sorting tracks how they should at all. 其次,它没有排序就完全跟踪它们应该如何。 As a first pass this is how I'm trying to sort things: 作为第一步,这是我尝试对事物进行排序的方式:

return a.discNumber - b.discNumber && a.trackNumber - b.trackNumber;

What needs to fixed in order to get this to work? 为了使它起作用,需要修复什么?

 iTunesSearch(); function iTunesSearch(callback) { $.getJSON('http://itunes.apple.com/search?term=Speakerboxxx/The Love Below&entity=song&callback=?', function(data) { var results = data["results"], tracks = results.filter(function(entry) { return entry.collectionExplicitness == "explicit" }), sortedTracks = tracks.sort(function(a,b) { return a.discNumber - b.discNumber && a.trackNumber - b.trackNumber; }); for (var i = 0; i < sortedTracks.length; i++) { var discNo = "<td>" + sortedTracks[i]["discNumber"] + "</td>", trackNo = "<td>" + sortedTracks[i]["trackNumber"] + "</td>", trackName = "<td>" + sortedTracks[i]["trackName"] + "</td>", $tr = "<tr>" + discNo + trackNo + trackName + "</tr>"; $("table").append($tr); } console.log(tracks); }); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <table> <thead> <tr> <td>Disc Number</td> <td>Track Number</td> <td>Track Name</td> </tr> </thead> </table> 

You will want to use 您将要使用

return a.discNumber - b.discNumber || a.trackNumber - b.trackNumber;

for your comparison function, so that it does compare the track numbers only when the disc numbers are equal (not the other way round). 比较功能,以便仅在光盘编号相等时才比较曲目编号(反之则不行)。 Then, to sort something descending, just swap a and b : 然后,要对降序进行排序,只需交换ab

return a.discNumber - b.discNumber || b.trackNumber - a.trackNumber;

(to get ascending discs, but descending track numbers per disc) (要获取升序的光盘,但要降低每个光盘的轨道号)

Your comparison only checks the track number if the disc numbers are already different. 如果光盘号已经不同,则比较仅检查轨道号。 Not what you want. 不是你想要的。

Try: 尝试:

return (a.discNumber - b.discNumber) || (a.trackNumber - b.trackNumber);

 iTunesSearch(); function iTunesSearch(callback) { $.getJSON('http://itunes.apple.com/search?term=Speakerboxxx/The Love Below&entity=song&callback=?', function(data) { var results = data["results"], tracks = results.filter(function(entry) { return entry.collectionExplicitness == "explicit" }), sortedTracks = tracks.sort(function(a,b) { return a.discNumber - b.discNumber || a.trackNumber - b.trackNumber; }); for (var i = 0; i < sortedTracks.length; i++) { var discNo = "<td>" + sortedTracks[i]["discNumber"] + "</td>", trackNo = "<td>" + sortedTracks[i]["trackNumber"] + "</td>", trackName = "<td>" + sortedTracks[i]["trackName"] + "</td>", $tr = "<tr>" + discNo + trackNo + trackName + "</tr>"; $("table").append($tr); } console.log(tracks); }); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <table> <thead> <tr> <td>Disc Number</td> <td>Track Number</td> <td>Track Name</td> </tr> </thead> </table> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM