Сортировка массива Javascript по нескольким критериям

У меня есть массив JavaScript, в котором хранятся ученики и назначенные им уроки;

tablo[0] = ['Molly','Class3A','2018.12.18','13:50'];
tablo[1] = ['Ashley','Class4C','2018.10.14','14:50'];
tablo[2] = ['John','Class3A','2018.01.01','13:50'];
tablo[3] = ['Molly','Class3A','2018.11.20','13:50'];
tablo[4] = ['John','Class3A','2018.12.18','15:50'];
tablo[5] = ['Molly','Class3A','2018.09.11','13:50'];
tablo[6] = ['Ashley','Class4C','2018.10.14','15:50'];
tablo[7] = ['Ashley','Class4C','2018.11.12','13:50'];
tablo[8] = ['John','Class3A','2018.01.01','18:50'];
tablo[9] = ['John','Class3A','2018.01.01','10:50'];
tablo[10] = ['Molly','Class3A','2018.12.31','13:50'];
tablo[11] = ['Ashley','Class4C','2018.10.14','08:50'];
tablo[12] = ['Molly','Class3A','2018.05.07','13:50'];
tablo[13] = ['John','Class3A','2018.01.01','07:50'];
tablo[14] = ['Molly','Class3A','2018.09.11','12:50'];
tablo[15] = ['Molly','Class3A','2018.09.11','15:50'];
tablo[16] = ['Ashley','Class4C','2018.11.12','10:50'];

Я хочу отсортировать этот массив сначала по именам классов, затем по именам учеников, затем по дате и, наконец, по часам. Отсортированный массив должен быть таким;

tablo[0] = ['John','Class3A','2018.01.01','07:50'];
tablo[1] = ['John','Class3A','2018.01.01','10:50'];
tablo[2] = ['John','Class3A','2018.01.01','13:50'];
tablo[3] = ['John','Class3A','2018.01.01','18:50'];
tablo[4] = ['John','Class3A','2018.12.18','15:50'];
tablo[5] = ['Molly','Class3A','2018.05.07','13:50'];
tablo[6] = ['Molly','Class3A','2018.09.11','12:50'];
tablo[7] = ['Molly','Class3A','2018.09.11','13:50'];
tablo[8] = ['Molly','Class3A','2018.09.11','15:50'];
tablo[9] = ['Molly','Class3A','2018.11.20','13:50'];
tablo[10] = ['Molly','Class3A','2018.12.18','13:50'];
tablo[11] = ['Molly','Class3A','2018.12.31','13:50'];
tablo[12] = ['Ashley','Class4C','2018.10.14','08:50'];
tablo[13] = ['Ashley','Class4C','2018.10.14','14:50'];
tablo[14] = ['Ashley','Class4C','2018.10.14','15:50'];
tablo[15] = ['Ashley','Class4C','2018.11.12','10:50'];
tablo[16] = ['Ashley','Class4C','2018.11.12','13:50'];

Есть много способов сортировки по 2 критериям, но я не могу справиться с сортировкой по 4 критериям, как в примере выше.


person Rose_The_Only    schedule 18.12.2018    source источник
comment
Что вы пробовали? Поделитесь усилиями пожалуйста. И, возможно, дубликат stackoverflow.com/questions/2784230/   -  person Alexis    schedule 18.12.2018
comment
Опубликованный вопрос не содержит какой-либо попытки решить проблему. StackOverflow ожидает, что вы попытаетесь решить свою проблему во-первых, поскольку ваши попытки помогают нам лучше понять, чего вы хотите. Пожалуйста, отредактируйте вопрос, чтобы показать, что вы пробовали, чтобы проиллюстрировать конкретное препятствие, с которым вы сталкиваетесь, в минимально воспроизводимом примере . Для получения дополнительной информации см. раздел Как спросить и воспользуйтесь тур.   -  person CertainPerformance    schedule 18.12.2018
comment
Возможно, этот ответ поможет. Поскольку у вас есть массив массивов, вы можете сравнить строку следующим образом: const compareClassName = (direction) => (a, b) => a[1].localeCompare(b[1]) * direction;   -  person HMR    schedule 18.12.2018


Ответы (3)


Попробуй это

tablo.sort( (a,b)=> a[1].localeCompare(b[1]) || a[0].localeCompare(b[0]) ||
                    a[2].localeCompare(b[2]) || a[3].localeCompare(b[3])    );

tablo = [];

tablo[0] = ['Molly','Class3A','2018.12.18','13:50'];
tablo[1] = ['Ashley','Class4C','2018.10.14','14:50'];
tablo[2] = ['John','Class3A','2018.01.01','13:50'];
tablo[3] = ['Molly','Class3A','2018.11.20','13:50'];
tablo[4] = ['John','Class3A','2018.12.18','15:50'];
tablo[5] = ['Molly','Class3A','2018.09.11','13:50'];
tablo[6] = ['Ashley','Class4C','2018.10.14','15:50'];
tablo[7] = ['Ashley','Class4C','2018.11.12','13:50'];
tablo[8] = ['John','Class3A','2018.01.01','18:50'];
tablo[9] = ['John','Class3A','2018.01.01','10:50'];
tablo[10] = ['Molly','Class3A','2018.12.31','13:50'];
tablo[11] = ['Ashley','Class4C','2018.10.14','08:50'];
tablo[12] = ['Molly','Class3A','2018.05.07','13:50'];
tablo[13] = ['John','Class3A','2018.01.01','07:50'];
tablo[14] = ['Molly','Class3A','2018.09.11','12:50'];
tablo[15] = ['Molly','Class3A','2018.09.11','15:50'];
tablo[16] = ['Ashley','Class4C','2018.11.12','10:50'];

tablo.sort( (a,b)=> a[1].localeCompare(b[1]) || a[0].localeCompare(b[0]) ||
                    a[2].localeCompare(b[2]) || a[3].localeCompare(b[3]) );

console.log(tablo.map(x=>x.join(' ')));

person Kamil Kiełczewski    schedule 18.12.2018

Вы можете использовать string#localeCompare для сортировки данных.

let tablo = [[ "Molly", "Class3A", "2018.12.18", "13:50" ], [ "Ashley", "Class4C", "2018.10.14", "14:50" ], [ "John", "Class3A", "2018.01.01", "13:50" ], [ "Molly", "Class3A", "2018.11.20", "13:50" ], [ "John", "Class3A", "2018.12.18", "15:50" ], [ "Molly", "Class3A", "2018.09.11", "13:50" ], [ "Ashley", "Class4C", "2018.10.14", "15:50" ], [ "Ashley", "Class4C", "2018.11.12", "13:50" ], [ "John", "Class3A", "2018.01.01", "18:50" ], [ "John", "Class3A", "2018.01.01", "10:50" ], [ "Molly", "Class3A", "2018.12.31", "13:50" ], [ "Ashley", "Class4C", "2018.10.14", "08:50" ], [ "Molly", "Class3A", "2018.05.07", "13:50" ], [ "John", "Class3A", "2018.01.01", "07:50" ], [ "Molly", "Class3A", "2018.09.11", "12:50" ], [ "Molly", "Class3A", "2018.09.11", "15:50" ], [ "Ashley", "Class4C","2018.11.12", "10:50" ] ]
tablo.sort((a,b) => a[1].localeCompare(b[1],undefined, {numeric:true}) || a[0].localeCompare(b[0]) || a[2].localeCompare(b[2]) || a[3].localeCompare(b[3]) );
console.log(tablo);

person Hassan Imam    schedule 18.12.2018
comment
Лучше всего, чтобы функция реализовывала только одну вещь, если бы вы назвали свою функцию сортировки, она была бы названа sortByClassNameThenByName. Это уменьшит повторное использование и компоновку ваших функций. - person HMR; 18.12.2018

Вы можете попробовать это.

tablo.sort(function (a, b) {
   var res = a[1].localeCompare(b[1]); // Compare by classname
   if(res == 0) {   //Classnames are same, so comapre by student name
       res = a[0].localeCompare(b[0]); //Compare by student name
       if(res == 0){ //Student names are same, so comapre by date
           res = a[2].localeCompare(b[2]); //Compare by date TODO: Use some date parsing library like "momentjs" if required
           if(res == 0){ //Date is same, so comapre by hour
               res = a[3].localeCompare(b[3])
           }
       }
   }
   return res

});
person Shiva    schedule 18.12.2018