近期在大屏项目中产品对项目中柱状图的排序提出要求,首先按成绩(排序指标随意)从高到低排序,如果成绩相同按年龄从小到大排,针对该需求对后端返回的无序数据进行重排,直接上用例:
需要排序的数据例如:
let = arr: [
{name: '尼古拉斯1', age: 2, score: 89},
{name: '尼古拉斯2', age: 6, score: 81},
{name: '尼古拉斯3', age: 4, score: 90},
{name: '尼古拉斯4', age: 2, score: 78},
{name: '尼古拉斯5', age: 7, score: 85},
{name: '尼古拉斯6', age: 7, score: 92},
{name: '尼古拉斯6', age: 3, score: 85},
{name: '尼古拉斯7', age: 2, score: 59},
{name: '尼古拉斯8', age: 9, score: 100}
]
function boubleSort (parmas1, parmas2) { // parmas1, parmas2为排序指标参数(此用例中就指代‘成绩’和‘年龄’)
return function (a, b) {
if (a.parmas1 === b.parmas1) return b.parmas2 - a.parmas2
return a.parmas1 - b.parmas1
}
}
console.log(arr.sort(boubleSort ('score', 'age'))) // 看到网上有该种失误写法
这里有误的原因就是没有分清‘[]’和‘.’取对象属性值时的要求,
点操作符: 静态 不能是字符串
中括号操作符: 动态 可以是字符串
正确写法应该如下
function boubleSort2 (parmas1, parmas2) { // parmas1, parmas2为排序指标参数(此用例中就指代‘成绩’和‘年龄’)
return function (a, b) {
if (a[parmas1] === b[parmas1]) return b[parmas2] - a[parmas2]
return a[parmas1] - b[parmas1]
}
}
console.log(arr.sort(boubleSort2 ('score', 'age'))) // 分数为第一排序规则,年龄为第二排序规则