欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js自定义多字段排序

程序员文章站 2022-04-16 23:26:19
...
  • 多字段同时排序在后端很好实现,直接order by field1 asc, field2 asc,field3 desc…
  • 如下可实现在前端按照多字段同时排序:


//测试数据
var items = [
    {name:"linc",age:28,num:1234},
    {name:"linc",age:28,num:12345},
    {name:"kiki",age:20,num:12345},
    {name:"高峰",age:26,num:123},
    {name:"高峰",age:27,num:101},
    {name:"高峰",age:26,num:111},
    {name:"安迪",age:29,num:110},
    {name:"安迪",age:30,num:110}
];

//两个字段一升一降排序
(function asc-desc(){
    items.sort(function (a, b) {
        return SortByProps(a, b, { "name": "ascending", "age": "descending" });
    });
    console.log(items)
})();
//两个字段都降序排序,其他排序方向同理,也可再加字段
(function desc(){
    items.sort(function (a, b) {
        return SortByProps(a, b, { "name": "descending", "age": "descending" });
    });
    console.log(items)
})();
//不定义排序方向和字段,默认都升序排列
(function default(){
    items.sort(function (a, b) {
        return SortByProps(a, b);
    });
    console.log(items)
})();

//以下函数排序属性并未写死,可直接拿去用自定义属性
function SortByProps(item1, item2, obj) {
    var props = [];
    if(obj){
        props.push(obj)
    }
    var cps = []; // 存储排序属性比较结果。
    // 如果未指定排序属性(即obj不存在),则按照全属性升序排序。
    // 记录下两个排序项按照各个排序属性进行比较得到的结果    
    var asc = true;
    if (props.length < 1) {
        for (var p in item1) {
            if (item1[p] > item2[p]) {
                cps.push(1);
                break; // 大于时跳出循环。
            } else if (item1[p] === item2[p]) {
                cps.push(0);
            } else {
                cps.push(-1);
                break; // 小于时跳出循环。
            }
        }
    } 
    else {
        for (var i = 0; i < props.length; i++) {
            var prop = props[i];
            for (var o in prop) {
                asc = prop[o] === "ascending";
                if (item1[o] > item2[o]) {
                    cps.push(asc ? 1 : -1);
                    break; // 大于时跳出循环。
                } else if (item1[o] === item2[o]) {
                    cps.push(0);
                } else {
                    cps.push(asc ? -1 : 1);
                    break; // 小于时跳出循环。
                }
            }
        }
    }        

    // 根据各排序属性比较结果综合判断得出两个比较项的最终大小关系
    for (var j = 0; j < cps.length; j++) {
        if (cps[j] === 1 || cps[j] === -1) {
            return cps[j];
        }
    }
    return false;          
}