多重條件下的數組排序方法

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

根據一個或者多個屬性對數組進行排序,支持嵌套的屬性。並且能夠在每一個條件中指定排序的方向,並支持傳入比較函數。git

安裝

採用 npm 安裝:github

$ npm install --save arr-sort

採用 yarn 安裝:npm

$ yarn add arr-sort

用法

經過給定的對象屬性進行排序:windows

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. 傳入比較函數排序ui

若是提供了比較函數,數組會根據其返回值排序。比較函數具體能夠參考docscode

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.

相關文章
相關標籤/搜索