【发布时间】:2017-06-04 13:32:50
【问题描述】:
我想按subject (字符串,按字母顺序),然后级别 (int,升序)对数组进行排序,然后是 名称 (字符串,按字母顺序)。我在 SO 上找到了许多其他线程,但我没有找到任何按多个变量 types 排序的线程。我以为我有它,但它没有正确排序。
排序函数:
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",
},
];
如何按主题、级别、名称排序?
【问题讨论】:
-
也许先按主题排序,然后将具有相同主题的所有项目放入一个新列表并按级别排序,然后对名称进行相同操作,最后将其拼凑在一起?
-
字符串需要与
a.subject.localeCompare(b.subject)进行比较。排序函数需要返回一个正值或负值或零。目前对于字符串,它只返回true或false反映正数和零。缺少负片。 -
所以如果它是假的,它应该返回
-1? -
@DarkMatterMatt 每当第一个值需要在第二个值出现时,它都需要返回
-1。 -
您可以将所有内容简化为
scipads.sort((a, b) => a.subject.localeCompare(b.subject) || a.level - b.level || a.name.localeCompare(b.name));。
标签: javascript arrays sorting