陣列多重篩選條件排序方法

weixin_33924312發表於2018-02-20

根據一個或者多個屬性對陣列進行排序,支援巢狀的屬性。而且可以在每個條件中指定排序的方向,並支援傳入比較函式。

安裝

採用 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.

相關文章