排序函数 - 递归方式
function multiple_sort(arr) {
var prop, size
return function(a, b) {
function multiple_compare(a, b, arr) {
prop = arr.shift()
if (prop) {
size = a[prop].localeCompare(b[prop])
if (!size) {
return multiple_compare(a, b, arr)
}
return size
}
return 0
}
return multiple_compare(a, b, arr.slice())
}
}
排序函数 - while 方式
function multiple_sort(arr) {
return function(a, b) {
var size,
i = 0
do {
size = arr[i++](a, b)
} while (size === 0 && i < arr.length)
return size
}
}
使用
const data = [
{
x1: 'w1',
x2: 'fb',
x3: 'pc'
},
{
x1: 'w2',
x2: 'fb',
x3: 'pc'
},
{
x1: 'w1',
x2: 'gg',
x3: 'pc'
},
{
x1: 'w2',
x2: 'gg',
x3: 'pc'
},
{
x1: 'w1',
x2: 'fb',
x3: 'ios'
}
]
// 方式一使用
data.sort(multiple_sort(['x1', 'x2', 'x3']))
// 方式二使用
const x1_compare = function(a, b) {
return a.x1.localeCompare(b.x1)
}
const x2_compare = function(a, b) {
return a.x2.localeCompare(b.x2)
}
const x3_compare = function(a, b) {
return a.x3.localeCompare(b.x3)
}
data.sort(multiple_sort([x1_compare, x2_compare, x3_compare]))
笔记
- 方式一不能对不同属性进行不同大小逻辑判断,方式二反之
- 方式一调用比较简洁,方式二可定制化,各有利弊
- 方式一如果需要对不同属性进行不同大小排序,可传入一个数组对象进去做判断,如下调用:
data.sort( multiple_sort([ { prop: 'x1', sort: 'desc' }, { prop: 'x2', sort: 'asc' } ]) )
原文地址: github.com/liurongqing…