【问题标题】:Javascript Array Sort By Multi CriteriaJavascript数组按多条件排序
【发布时间】:2020-10-05 23:31:28
【问题描述】:

我有一个 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 个标准排序。

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    您可以使用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);

    【讨论】:

    • 最好让一个函数只实现一件事,如果你将你的排序函数命名为sortByClassNameThenByName。这将降低函数的可重用性和可组合性。
    【解决方案3】:

    你可以试试这个。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2012-02-11
      • 2013-09-13
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多