zoukankan      html  css  js  c++  java
  • JS Array 进行无限制多条件排序 可以指定正反顺序

    /************************************************************
     * JSArrayOrder.js
     * 0.1
     * JackieZheng 
     ************************************************************/
     
    function compare(a, b, orderArray, isReverse) {
        let c = orderArray[0];
        if (orderArray.length > 1 && (a[c] || a) === (b[c] || b)) {
            return compare(a, b, orderArray.slice(1), isReverse);
        } else {
            return (a[c] || a) === (b[c] || b) ? 0 : ((isReverse ? (a[c] || a) > (b[c] || b) : (a[c] || a) < (b[c] || b)) ? -1 : 1);
        }
    }
    /**
     * orderArray 指定排序属性,优先级依先后顺序 eg:["name", "num", "time"]
     * isReverse 是否倒序,默认 false
     */
    Array.prototype.orderBy = (Array.prototype.orderBy = function (orderArray, isReverse) {
        if (typeof (orderArray) === 'boolean' || typeof (orderArray) === "undefined") {
            isReverse = orderArray;
            orderArray = '';
        }
        if (typeof (orderArray) === 'string') {
            let str = orderArray;
            orderArray = [];
            orderArray.push(str);
        }
        return this.sort((a, b) => {
            return compare(a, b, orderArray, isReverse)
        })
    })
     
     
    

      

    /*** 以下测试代码***
    
    //测试例子
    var arr = [{
        name: 'b',
        num: 2,
        time: '2015-06-08 13:44:18'
    }, {
        name: 'b',
        num: 3,
        time: '2015-06-08 13:44:18'
    }, {
        name: 'a',
        num: 4,
        time: '2015-06-07 13:40:18'
    }, {
        name: 'a',
        num: 4,
        time: '2015-06-08 13:44:18'
    }, {
        name: 'c',
        num: 6,
        time: '2015-06-07 13:40:18'
    }, ];
    
    
    //单项默认排序
    arr.orderBy("num"); 
    //结果
    (5) [{…}, {…}, {…}, {…}, {…}]
    0: {name: "b", num: 2, time: "2015-06-08 13:44:18"}
    1: {name: "b", num: 3, time: "2015-06-08 13:44:18"}
    2: {name: "a", num: 4, time: "2015-06-08 13:44:18"}
    3: {name: "a", num: 4, time: "2015-06-07 13:40:18"}
    4: {name: "c", num: 6, time: "2015-06-07 13:40:18"}
    length: 5
    __proto__: Array(0)
    
    
    //单项反向排序
    arr.orderBy("num",true);  
    //结果
    (5) [{…}, {…}, {…}, {…}, {…}]
    0: {name: "c", num: 6, time: "2015-06-07 13:40:18"}
    1: {name: "a", num: 4, time: "2015-06-08 13:44:18"}
    2: {name: "a", num: 4, time: "2015-06-07 13:40:18"}
    3: {name: "b", num: 3, time: "2015-06-08 13:44:18"}
    4: {name: "b", num: 2, time: "2015-06-08 13:44:18"}
    length: 5
    __proto__: Array(0)
     
    //多项默认排序
    arr.orderBy(["name", "num", "time"]); 
    //结果
    (5) [{…}, {…}, {…}, {…}, {…}]
    0: {name: "a", num: 4, time: "2015-06-07 13:40:18"}
    1: {name: "a", num: 4, time: "2015-06-08 13:44:18"}
    2: {name: "b", num: 2, time: "2015-06-08 13:44:18"}
    3: {name: "b", num: 3, time: "2015-06-08 13:44:18"}
    4: {name: "c", num: 6, time: "2015-06-07 13:40:18"}
    length: 5
    __proto__: Array(0)
    
    
    //多项反向排序
    arr.orderBy(["name", "num", "time"], true);
    //结果
    (5) [{…}, {…}, {…}, {…}, {…}]
    0: {name: "c", num: 6, time: "2015-06-07 13:40:18"}
    1: {name: "b", num: 3, time: "2015-06-08 13:44:18"}
    2: {name: "b", num: 2, time: "2015-06-08 13:44:18"}
    3: {name: "a", num: 4, time: "2015-06-08 13:44:18"}
    4: {name: "a", num: 4, time: "2015-06-07 13:40:18"}
    length: 5
    __proto__: Array(0)
     
    //简单默认排序
    ["b","c","a"].orderBy()
    //结果
    (3) ["a", "b", "c"]
    0: "a"
    1: "b"
    2: "c"
    length: 3
    __proto__: Array(0)
    
    
    //简单反向排序
    ["b","c","a"].orderBy(true)
    //结果
    (3) ["c", "b", "a"]
    0: "c"
    1: "b"
    2: "a"
    length: 3
    __proto__: Array(0)
    
    
    //简单默认排序
    [11,2,1,6,5,10,56].orderBy()
    //结果
    (7) [1, 2, 5, 6, 10, 11, 56]
    0: 1
    1: 2
    2: 5
    3: 6
    4: 10
    5: 11
    6: 56
    length: 7
    __proto__: Array(0)
    
    
    //简单反向排序
    [11,2,1,6,5,10,56].orderBy(true)
    //结果
    (7) [56, 11, 10, 6, 5, 2, 1]
    0: 56
    1: 11
    2: 10
    3: 6
    4: 5
    5: 2
    6: 1
    length: 7
    __proto__: Array(0)
    
    
     *** 测试代码 结束***/
    

      

    PS:有兴趣可以修改代码,比如实现为单独条件指定 顺序。

    Github:https://github.com/JackieZheng/JSArrayOrder.js

  • 相关阅读:
    PAT (Advanced Level) Practice 1100 Mars Numbers (20分)
    PAT (Advanced Level) Practice 1107 Social Clusters (30分) (并查集)
    PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
    PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
    PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)
    PAT (Advanced Level) Practice 1110 Complete Binary Tree (25分) (完全二叉树的判断+分享致命婴幼儿错误)
    PAT (Advanced Level) Practice 1109 Group Photo (25分)
    PAT (Advanced Level) Practice 1108 Finding Average (20分)
    P6225 [eJOI2019]异或橙子 树状数组 异或 位运算
    P4124 [CQOI2016]手机号码 数位DP
  • 原文地址:https://www.cnblogs.com/admans/p/12834229.html
Copyright © 2011-2022 走看看