-
Couldn't load subscription status.
- Fork 6
Open
Description
这是前端晚练课的第 1 期,希望大家在参与前先去「达成以下 2 个成就」:
- 有看过 「前端晚练课的简介、愿景、角色、参与方式和激励措施」
- 有阅读过 「答题规范」
来源:原创题
难度:★★
封装一个多重排序函数 multiSort,功能要求:
- 接收一个对象数组,返回一个按多个字段名顺序排序后的新数组;
- 可自定义排序参照的字段名顺序;
例如:
['field2', 'field1', 'field3']首先按
field2进行排序,如果field2的值相等,则按field1排序;如果field1的值仍相等,则按field3排序……
- 可设置排序规则为正序(升序)或倒序(降序),默认为正序。
实战用例:
根据员工数据,评选出月度最佳员工
[
{ "name": "Sweet", "education": 4, "sales": 10, "duty": 24, "workAge": 2 },
{ "name": "Tough", "education": 3, "sales": 15, "duty": 24, "workAge": 6 },
{ "name": "Yummy", "education": 4, "sales": 10, "duty": 24, "workAge": 4 },
{ "name": "Ghost", "education": 6, "sales": 15, "duty": 23, "workAge": 8 },
{ "name": "Flora", "education": 5, "sales": 15, "duty": 24, "workAge": 6 }
]按 销售额(sales)、出勤天数(duty)、工龄(workAge)、教育程度(education) 的顺序 降序 排名:
[
{ "name": "Flora", "education": 5, "sales": 15, "duty": 24, "workAge": 6 },
{ "name": "Tough", "education": 3, "sales": 15, "duty": 24, "workAge": 6 },
{ "name": "Ghost", "education": 6, "sales": 15, "duty": 23, "workAge": 8 },
{ "name": "Yummy", "education": 4, "sales": 10, "duty": 24, "workAge": 4 },
{ "name": "Sweet", "education": 4, "sales": 10, "duty": 24, "workAge": 2 }
]参考答案:
function multiSort(arr, rules, reversal) {
return [...arr].sort((o, p) => {
let a, b;
for (let rule of rules) {
a = o[rule];
b = p[rule];
if (a !== b) {
return (a - b) * (reversal ? -1 : 1);
}
}
});
}
// 或者挂载到 Array 构造函数的原型上
Array.prototype.multiSort = function(rules, reversal) {
return [...this].sort((o, p) => {
// 逻辑代码同上,此处略
});
}本期优秀回答者: @cnyballk
wingmeng and liwenkang
Metadata
Metadata
Assignees
Labels
No labels