根據一個或者多個屬性對陣列進行排序,支援巢狀的屬性。而且可以在每個條件中指定排序的方向,並支援傳入比較函式。
安裝
採用 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, 我們直接比較值的大小
- 如果是 string, 我們採用
- 如果提供的比較函式沒有返回值,則這次的排序會自動跳過
例子
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.