1. 程式人生 > >陣列多重篩選條件排序方法

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

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.