您的位置:首页 > 其它

数组多重筛选条件排序方法

2018-02-19 01:05 477 查看

arr-sort









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

安装

采用 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} ]


关于

相关项目

arr-del: 一次性删除数组指定index的元素 | homepage

集成测试

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

$ npm install && npm test


作者

tywei90

github/tywei90

blog/tywei90

许可证

Copyright © 2018, tywei90.

Released under the MIT License.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组排序