具有多个值(字符串和数字)的 JavaScript array.sort

标签 javascript arrays sorting

我想按主题 (字符串,字母顺序) 对数组进行排序,然后是级别 (整数,升序) ,然后是名称 (字符串,字母顺序)。我在 SO 上发现了许多其他线程,但我还没有找到任何按多个变量类型排序的线程。我以为我有它,但它没有正确排序。

排序函数:

scipads.sort(function (a, b) {
    if (a.subject != b.subject)
        return a.subject < b.subject;
    if (a.level != b.level)
        return a.level - b.level;
    return a.name < b.name;
});

数组:

var scipads = [{
        "name": "L2 Physics Externals",
        "level": 2,
        "subject": "physics",
    }, {
        "name": "L2 Physics Internals",
        "level": 2,
        "subject": "physics",
    }, {
        "name": "L2 Chem Externals",
        "level": 2,
        "subject": "chemistry",
    }, {
        "name": "L2 Chem Internals",
        "level": 2,
        "subject": "chemistry",
    }, {
        "name": "L2 Bio Internals",
        "level": 2,
        "subject": "biology",
    }, {
        "name": "L2 Bio Externals",
        "level": 2,
        "subject": "biology",
    }, {
        "name": "L1 Electricity & Magnetism",
        "level": 1,
        "subject": "physics",
    }, {
        "name": "L1 Wave Behaviour",
        "level": 1,
        "subject": "physics",
    }, {
        "name": "L1 Heat",
        "level": 1,
        "subject": "physics",
    }, {
        "name": "L1 Carbon Chemistry",
        "level": 1,
        "subject": "chemistry",
    }, {
        "name": "L1 Selected Elements",
        "level": 1,
        "subject": "chemistry",
    }, {
        "name": "L1 Chemical Reactions",
        "level": 1,
        "subject": "chemistry",
    },
];

如何按主题、级别、姓名排序?

最佳答案

使用localeCompare 比较字符串

var scipads=[{name:"L2 Physics Externals",level:2,subject:"physics"},{name:"L2 Physics Internals",level:2,subject:"physics"},{name:"L2 Chem Externals",level:2,subject:"chemistry"},{name:"L2 Chem Internals",level:2,subject:"chemistry"},{name:"L2 Bio Internals",level:2,subject:"biology"},{name:"L2 Bio Externals",level:2,subject:"biology"},{name:"L1 Electricity & Magnetism",level:1,subject:"physics"},{name:"L1 Wave Behaviour",level:1,subject:"physics"},{name:"L1 Heat",level:1,subject:"physics"},{name:"L1 Carbon Chemistry",level:1,subject:"chemistry"},{name:"L1 Selected Elements",level:1,subject:"chemistry"},{name:"L1 Chemical Reactions",level:1,subject:"chemistry"}];

scipads.sort(function(a, b) {
  if (a.subject != b.subject)
    return a.subject.localeCompare(b.subject);
  else if (a.level != b.level)
    return a.level - b.level;
  return a.name.localeCompare(b.name);
});

console.log(scipads);

关于具有多个值(字符串和数字)的 JavaScript array.sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350911/

相关文章:

javascript - 将变量从 &lt;script&gt; 传递到 HTML 代码?

javascript - 如何即时包含 React jsx 文件,而不是使用 React-router 一次性包含所有文件?

javascript - 打印带有 IFRAME 内容的 HTML

mysql - 使用 MYSQL_ASSOC 而不是 MYSQL_BOTH 获取 mysql 数组是否会影响性能

javascript - cordova使用什么js 'engine'?

sql - Rails 5 - 如何使用 postgresql 查询?

javascript - 为什么在 &lt;script&gt; 标签之后需要 $(document).ready?

arrays - Swift 从具有不同索引的其他字典数组中获取值

将数据数组转换为兼容的结构

python - 仅当元组中的数字相等时,如何根据字母顺序排列此列表中的元组?