У меня есть куча песен, хранящихся в массиве объектов JavaScript. Это выглядит так:Сортировка массива объектов JSON по свойствам с порядком важности
var library = [
{ "title": "40 Years Later", "album": "Tears of Steel", "year": 2012, "track": 1, "disk": 1, "time": 31 },
{ "title": "The Dome", "album": "Tears of Steel", "year": 2012, "track": 2, "disk": 1, "time": 311 },
{ "title": "The Battle", "album": "Tears of Steel", "year": 2012, "track": 3, "disk": 1, "time": 123 },
{ "title": "End Credits", "album": "Tears of Steel", "year": 2012, "track": 4, "disk": 1, "time": 103 },
{ "title": "The Wires", "album": "Elephants Dream", "year": 2006, "track": 1, "disk": 1, "time": 75 },
{ "title": "Typewriter Dance", "album": "Elephants Dream", "year": 2006, "track": 2, "disk": 1, "time": 70 },
{ "title": "The Safest Place", "album": "Elephants Dream", "year": 2006, "track": 3, "disk": 1, "time": 45 },
{ "title": "Emo Creates", "album": "Elephants Dream", "year": 2006, "track": 4, "disk": 1, "time": 60 },
{ "title": "End Title", "album": "Elephants Dream", "year": 2006, "track": 5, "disk": 1, "time": 91 },
{ "title": "Teaser Music", "album": "Elephants Dream", "year": 2006, "track": 6, "disk": 1, "time": 75 },
{ "title": "Ambience", "album": "Elephants Dream", "year": 2006, "track": 7, "disk": 1, "time": 110 },
{ "title": "Snow Fight", "album": "Sintel", "year": 2010, "track": 1, "disk": 1, "time": 107 },
{ "title": "Finding Scales/Chicken Run", "album": "Sintel", "year": 2010, "track": 2, "disk": 1, "time": 107 },
{ "title": "The Ziggurat", "album": "Sintel", "year": 2010, "track": 3, "disk": 1, "time": 78 },
{ "title": "Expedition", "album": "Sintel", "year": 2010, "track": 4, "disk": 1, "time": 93 },
{ "title": "Dragon Blood Tree", "album": "Sintel", "year": 2010, "track": 5, "disk": 1, "time": 47 },
{ "title": "Cave Fight/Lament", "album": "Sintel", "year": 2010, "track": 6, "disk": 1, "time": 145 },
{ "title": "I Move On (Sintel's Song)", "album": "Sintel", "year": 2010, "track": 7, "disk": 1, "time": 169 },
{ "title": "Circling Dragons", "album": "Sintel", "year": 2010, "track": 8, "disk": 1, "time": 28 },
{ "title": "Trailer Music", "album": "Sintel", "year": 2010, "track": 9, "disk": 1, "time": 44 }
];
Мне нужно отсортировать по свойствам в алфавитном порядке и в цифровом порядке. В StackOverflow есть много статей и вопросов, которые охватывают сортировку по одному значению, а некоторые, похоже, охватывают несколько значений, но у них нет порядка или важности.
Мне нужно отсортировать каждый объект (песню) несколькими значениями, где каждое значение имеет более низкий рейтинг. Например:
album
имя (алфавитный)>disk
номер (числовой)>track
номер (числовой)>title
(алфавитный)> т.д.
Это означает, эти альбомы вместе, где каждый альбом находится в алфавитном порядке. В каждом альбоме песни сортируются по номеру диска, поэтому все песни на диске 1 находятся наверху, затем все песни на диске 2 и т. Д. В каждой группе номеров дисков записаны песни, отсортированные по номеру дорожки. Если есть несколько песен с одним и тем же номером трека или номер трека отсутствует, они будут отсортированы по названию песни в алфавитном порядке. Дополнительные свойства могут быть заданы, если название дорожки также одинаково.
Капитализация не должна иметь значения, и она должна выглядеть как обычная сортировка в алфавитном порядке (если она начинается с числа, которое будет идти до букв, а специальные символы будут иметь место, как в традиционной сортировке).
Я пробовал использовать этот код (который имеет жестко заданные значения сортировки и недостатки номеров дисков), но это только сортировка по самому внутреннему свойству в коде, номер дорожки.
library.sort(function (a, b) {
if (a.album === b.album) {
if (a.track === b.track) {
var x = a.title.toLowerCase();
var y = b.title.toLowerCase();
return x < y ? -1 : x > y ? 1 : 0;
}
var x = a.track;
var y = b.track;
return x < y ? -1 : x > y ? 1 : 0;
}
return a.album.toLowerCase() - b.album.toLowerCase();
});
Я ищу функцию, которая будет переставить library
массив таким образом, чтобы он сортируется, как описано выше заданной что-то вдоль линий следующего ввода:
sort(library, [ "album", "disk", "track", "title" ]);
Отдельные значения также должны быть в состоянии для сортировки в порядке убывания, возможно, выглядя что-то вроде -album
или ["album", true]
. Синтаксис является гибким.
забыли '<' в тройном выражении – Ferdi265
В вашей альтернативной версии синтаксиса, является '+' опциональной? – Keavon
Да, '+' не является обязательным. Это необходимо для того, чтобы можно было иметь ключи, начинающиеся с '-' (просто используйте' '+ - keywithdash'', чтобы сортировать такой ключ в порядке возрастания и' '--- keywithdash'' для нисходящего) – Ferdi265