这是前端晚练课的第 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
这是前端晚练课的第 1 期,希望大家在参与前先去「达成以下 2 个成就」:
封装一个多重排序函数
multiSort,功能要求:实战用例:
根据员工数据,评选出月度最佳员工
[ { "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 } ]参考答案:
本期优秀回答者: @cnyballk