[英]JavaScript array.sort with multiple values (strings and numbers)
I'd like to sort an array by subject (string, alphabetical) , then level (int, ascending) , then name (string, alphabetical) . 我想按主语 (字符串,字母)排序数组,然后是level (int,ascending) ,然后是name (字符串,字母) 。 I have found numerous other threads on SO but I haven't found any which sort by multiple variable types .
我在SO上发现了许多其他线程,但我没有找到任何多种变量类型 。 I thought I had it, but it isn't sorting properly.
我以为我有它,但它没有正确排序。
The sort function: 排序功能:
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;
});
The array: 数组:
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",
},
];
How can I sort by subject, then level, then name? 我如何按主题排序,然后是水平,然后命名?
Comparison should return an integer . 比较应该返回一个整数 。 Here's an example:
这是一个例子:
scipads.sort((a, b) => {
if (a.subject != b.subject) {
return a.subject < b.subject ? -1 : 1;
}
if (a.level != b.level) {
return a.level - b.level;
}
return a.name < b.name ? -1 : 1;
})
Your sort compare function is close, but not quite on. 您的排序比较功能已接近,但尚未完全开启。 You should be returning -1 for less than, 0 for equal, and 1 for greater than.
你应该返回-1表示小于0,0表示相等,1表示大于。 See here for documentation.
请参阅此处获取文档
Example: change return a.subject < b.subject
to return a.subject < b.subject ? -1 : 1;
示例:更改
return a.subject < b.subject
以return a.subject < b.subject ? -1 : 1;
return a.subject < b.subject ? -1 : 1;
Use localeCompare
for comparing strings 使用
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);
My solution, compare subject first, then compare the level 我的解决方案,首先比较主题,然后比较水平
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"}]; // sort by subject, then level, then name var res = scipads.sort((a, b) => { if (a.subject > b.subject) { return 1; } else if (a.subject < b.subject) { return -1; } else if ( a.level > b.level){ return 1; } else if (a.level < b.level) { return -1; } else if (a.name > b.name) { return 1; } else if (a.name < b.name) { return -1; } return 0; }); console.log(res)
To compare string, you should use string.localeCompare
. 要比较字符串,您应该使用
string.localeCompare
。 Also, you can try to create an array with priority list and loop over it to sort. 此外,您可以尝试创建一个具有优先级列表的数组,并在其上循环进行排序。
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"}]; var priority = ["subject", "level", "name"] scipads.sort(function(a,b){ var val = 0; priority.some(function(k){ val = compare(a,b,k); return val !== 0; }); }) function compare(a,b,k){ switch(typeof a[k]){ case "string": return a[k].localeCompare(b[k]); case "number": return a[k] - b[k] } } console.log(scipads)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.