1 | var arrayEach = require('./arrayEach')
|
2 | var toArray = require('./toArray')
|
3 | var map = require('./map')
|
4 |
|
5 | var isArray = require('./isArray')
|
6 | var isFunction = require('./isFunction')
|
7 | var isPlainObject = require('./isPlainObject')
|
8 | var isUndefined = require('./isUndefined')
|
9 | var isNull = require('./isNull')
|
10 | var eqNull = require('./eqNull')
|
11 | var get = require('./get')
|
12 | var property = require('./property')
|
13 |
|
14 | var ORDER_PROP_ASC = 'asc'
|
15 | var ORDER_PROP_DESC = 'desc'
|
16 |
|
17 | // function handleSort (v1, v2) {
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | function handleSort (v1, v2) {
|
23 | if (isUndefined(v1)) {
|
24 | return 1
|
25 | }
|
26 | if (isNull(v1)) {
|
27 | return isUndefined(v2) ? -1 : 1
|
28 | }
|
29 | return v1 && v1.localeCompare ? v1.localeCompare(v2) : (v1 > v2 ? 1 : -1)
|
30 | }
|
31 |
|
32 | function buildMultiOrders (name, confs, compares) {
|
33 | return function (item1, item2) {
|
34 | var v1 = item1[name]
|
35 | var v2 = item2[name]
|
36 | if (v1 === v2) {
|
37 | return compares ? compares(item1, item2) : 0
|
38 | }
|
39 | return confs.order === ORDER_PROP_DESC ? handleSort(v2, v1) : handleSort(v1, v2)
|
40 | }
|
41 | }
|
42 |
|
43 | function getSortConfs (arr, list, fieldConfs, context) {
|
44 | var sortConfs = []
|
45 | fieldConfs = isArray(fieldConfs) ? fieldConfs : [fieldConfs]
|
46 | arrayEach(fieldConfs, function (handle, index) {
|
47 | if (handle) {
|
48 | var field = handle
|
49 | var order
|
50 | if (isArray(handle)) {
|
51 | field = handle[0]
|
52 | order = handle[1]
|
53 | } else if (isPlainObject(handle)) {
|
54 | field = handle.field
|
55 | order = handle.order
|
56 | }
|
57 | sortConfs.push({
|
58 | field: field,
|
59 | order: order || ORDER_PROP_ASC
|
60 | })
|
61 | arrayEach(list, isFunction(field) ? function (item, key) {
|
62 | item[index] = field.call(context, item.data, key, arr)
|
63 | } : function (item) {
|
64 | item[index] = field ? get(item.data, field) : item.data
|
65 | })
|
66 | }
|
67 | })
|
68 | return sortConfs
|
69 | }
|
70 |
|
71 | /**
|
72 | * 将数组进行排序
|
73 | *
|
74 | * @param {Array} arr 数组
|
75 | * @param {Function/String/Array} fieldConfs 方法或属性
|
76 | * @param {Object} context 上下文
|
77 | * @return {Array}
|
78 | */
|
79 | function orderBy (arr, fieldConfs, context) {
|
80 | if (arr) {
|
81 | if (eqNull(fieldConfs)) {
|
82 | return toArray(arr).sort(handleSort)
|
83 | }
|
84 | var compares
|
85 | var list = map(arr, function (item) {
|
86 | return { data: item }
|
87 | })
|
88 | var sortConfs = getSortConfs(arr, list, fieldConfs, context)
|
89 | var len = sortConfs.length - 1
|
90 | while (len >= 0) {
|
91 | compares = buildMultiOrders(len, sortConfs[len], compares)
|
92 | len--
|
93 | }
|
94 | if (compares) {
|
95 | list = list.sort(compares)
|
96 | }
|
97 | return map(list, property('data'))
|
98 | }
|
99 | return []
|
100 | }
|
101 |
|
102 | module.exports = orderBy
|