• 多重条件下的数组排序方法


    arr-sort GitHub license NPM version NPM monthly downloads NPM total downloads Windows Build Status

    根据一个或者多个属性对数组进行排序,支持嵌套的属性。而且可以在每个条件中指定排序的方向,并支持传入比较函数。

    安装

    采用 npm 安装:

    $ npm install --save arr-sort
    

    采用 yarn 安装:

    $ yarn add arr-sort
    

    用法

    通过给定的对象属性进行排序:

    var arrSort = require('arr-sort');
    
    arrSort([{foo: 'y'}, {foo: 'z'}, {foo: 'x'}],[{attr:'foo'}]);
    //=> [{foo: 'x'}, {foo: 'y'}, {foo: 'z'}]
    

    逆向排序

    arrSort([{foo: 'y'}, {foo: 'z'}, {foo: 'x'}],[{attr:'foo', asc: false}]);
    //=> [{foo: 'z'}, {foo: 'y'}, {foo: 'x'}]
    

    参数

    arrSort(array, comparisonArgs);
    
    • array: { Object Array } 待排序的数组
    • comparisonArgs: { Object Array } 一个或者多个对象组成的数组。 结构如下:{ 'attr': attr, 'asc': asc }
      • attr: { String } 对象属性
      • asc: { Boolean | Function } 指定排序的方向
        • true: 升序(默认值)
        • false: 降序
        • function: 传入的比较函数

    注意

    • 如何没有提供 attr 属性, 则这次的排序会自动跳过
    • attr 属性值类型可以是 string 或者 number
      • 如果是 string, 我们采用 localeCompare 去比较排序
      • 如果是 number, 我们直接比较值的大小
    • 如果提供的比较函数没有返回值,则这次的排序会自动跳过

    例子

    1. 多重条件排序

    var arrSort = require('arr-sort');
    
    var array = [
      { foo: 'bbb', num: 4,  flag: 2 },
      { foo: 'aaa', num: 3,  flag: 1 },
      { foo: 'ccc', num: -6, flag: 2 },
      { foo: 'ccc', num: 8,  flag: 2 },
      { foo: 'bbb', num: 2,  flag: 4 },
      { foo: 'aaa', num: -3, flag: 4 }
    ];
    
    // sort by `flag`, then `foo`, then `num`
    var result = arrSort(array,
        [{
            attr: 'flag',
            asc: true
        },
        {
            attr: 'foo',
            asc: false
        },
        {
            attr: 'num',
            asc: true
        }]
    );
    
    console.log(result);
    // [ { foo: 'aaa', num: 3,  flag: 1},
    //   { foo: 'ccc', num: -6, flag: 2},
    //   { foo: 'ccc', num: 8,  flag: 2},
    //   { foo: 'bbb', num: 4,  flag: 2},
    //   { foo: 'bbb', num: 2,  flag: 4},
    //   { foo: 'aaa', num: -3, flag: 4} ]
    

    2. 嵌套的属性排序

    var arrSort = require('arr-sort');
    
    var array = [
      { locals: { foo: 'bbb', num: 4 },  flag: 2},
      { locals: { foo: 'aaa', num: 3 },  flag: 1},
      { locals: { foo: 'ccc', num: -6 }, flag: 2},
      { locals: { foo: 'ccc', num: 8 },  flag: 2},
      { locals: { foo: 'bbb', num: 2 },  flag: 4},
      { locals: { foo: 'aaa', num: -3 }, flag: 4},
    ];
    
    // sort by `flag`, then `locals.foo`, then `locals.num`
    var result = arrSort(array,
        [{
            attr: 'flag',
            asc: true
        },
        {
            attr: 'locals.foo',
            asc: false
        },
        {
            attr: 'locals.num',
            asc: true
        }]
    );
    
    console.log(result);
    // [ { locals: { foo: 'aaa', num: 3 },  flag: 1},
    //   { locals: { foo: 'ccc', num: -6 }, flag: 2},
    //   { locals: { foo: 'ccc', num: 8 },  flag: 2},
    //   { locals: { foo: 'bbb', num: 4 },  flag: 2},
    //   { locals: { foo: 'bbb', num: 2 },  flag: 4},
    //   { locals: { foo: 'aaa', num: -3 }, flag: 4} ]
    

    3. 传入比较函数排序

    如果提供了比较函数,数组会根据其返回值排序。比较函数具体可以参考docs

    var arrSort = require('arr-sort');
    
    var array = [
      { locals: { foo: 'bbb', num: 4 },  flag: -2},
      { locals: { foo: 'aaa', num: 3 },  flag: 1},
      { locals: { foo: 'ccc', num: -6 }, flag: 2},
      { locals: { foo: 'ccc', num: 8 },  flag: 2},
      { locals: { foo: 'bbb', num: 2 },  flag: 4},
      { locals: { foo: 'aaa', num: -3 }, flag: 4},
    ];
    
    // sort by `flag`, then `locals.foo`, then `locals.num`
    var result = arrSort(array,
        [{
            attr: 'flag',
            asc: function(a,b){return (Math.abs(a) - Math.abs(b))}
        },
        {
            attr: 'locals.foo',
            asc: false
        },
        {
            attr: 'locals.num',
            asc: true
        }]
    );
    
    console.log(result);
    // [ { locals: { foo: 'aaa', num: 3 },  flag: 1},
    //   { locals: { foo: 'ccc', num: -6 }, flag: 2},
    //   { locals: { foo: 'ccc', num: 8 },  flag: 2},
    //   { locals: { foo: 'bbb', num: 4 },  flag: -2},
    //   { locals: { foo: 'bbb', num: 2 },  flag: 4},
    //   { locals: { foo: 'aaa', num: -3 }, flag: 4} ]
    

    关于

    相关项目

    集成测试

    跑集成测试是一个非常好的熟悉一个项目及其API的方法。你可以通过以下命令安装依赖并跑测试:

    $ npm install && npm test
    

    作者

    tywei90

    许可证

    Copyright © 2018, tywei90.
    Released under the MIT License.

    更多内容欢迎访问我的博客:https://www.wty90.com/
  • 相关阅读:
    uva 10192 Vacation(最长公共子)
    SolrCloud应用简介
    2015第43周一solr相关概念
    2015第42周日
    2015第42周六Pgsql全文索引
    Java注解
    2015第42周四
    2015第42周三
    JS原型函数相关基础知识
    2015第42周一爬虫与反爬虫
  • 原文地址:https://www.cnblogs.com/tywei90/p/8456557.html
Copyright © 2020-2023  润新知