面试题
有两个数组data和sorts如下:根据sorts对data排序
var data = [{ a: 1, b: 'a' }, { a: 2, b: 'c' }, { a: 2, b: 'b' }]
var sorts = [{ key: 'a', order: 'desc' }, { key: 'b', order: 'asc' }]
正确结果如下:
解决
针对此题我们可以这么去做
var data = [{ a: 1, b: 'a' }, { a: 2, b: 'c' }, { a: 2, b: 'b' }]
var sorts = [{ key: 'a', order: 'desc' }, { key: 'b', order: 'asc' }]
console.log(multipleSort(data, sorts))
function multipleSort(data, sorts) {
//使用reverse反转排序条件,否则第二次的结果会影响第一次
sorts.reverse().forEach(sort => {
data.sort(compare(sort.key, sort.order))
})
function compare(key, order) {
return function (m, n) {
//遇到字母转成ascii码判断,如果是字符串可以截取首字母再转ascii再排序
var value1 = typeof (m[key]) == "number" ? m[key] : m[key].charCodeAt()
var value2 = typeof (n[key]) == "number" ? n[key] : n[key].charCodeAt()
if (order === 'desc')
return value2 - value1;
else
return value1 - value2;
}
}
return data;
}
总结
1.官方的默认方法.sort()支持按字母排序,.reverse()颠倒;但对于指定对象中的某个字段并且这个字段的值为字母时好像无法处理。这里我想到的是把字母转成ascii码即数字来处理,如果值是字符串的话,也可以去取首字母转化后再来排序。
2.多次排序的话,后续结果会影响前面的,所以这里排序规则应该倒过来写,先执行第二步按b升序,再执行按a降序
如有更好的方法,欢迎指教。