这是前端晚练课的第 1 期,希望大家在参与前先去「达成以下 2 个成就」: 1. 有看过 [「前端晚练课的简介、愿景、角色、参与方式和激励措施」](https://github.com/fezaoduke/fe-practice-hard/blob/master/about.md) 2. 有阅读过 [「答题规范」](https://github.com/fezaoduke/fe-practice-hard/issues/1) ---- > 来源:原创题 > 难度:★★ **封装一个多重排序函数 `multiSort`,功能要求:** 1. 接收一个对象数组,返回一个按多个字段名顺序排序后的新数组; 2. 可自定义排序参照的字段名顺序; > 例如:`['field2', 'field1', 'field3']` > > 首先按 `field2` 进行排序,如果 `field2` 的值相等,则按 `field1` 排序;如果 `field1` 的值仍相等,则按 `field3` 排序…… 2. 可设置排序规则为正序(升序)或倒序(降序),默认为正序。 **实战用例:** 根据员工数据,评选出月度最佳员工 ```json [ { "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)` 的顺序 `降序` 排名: ```json [ { "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 } ] ``` ---- **参考答案:** ```js 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
Activity
liwenkang commentedon May 8, 2019
cnyballk commentedon May 8, 2019
limoning commentedon May 9, 2019
ahao430 commentedon May 9, 2019