UNPKG

2.75 kBJavaScriptView Raw
1var arrayEach = require('./arrayEach')
2var toArray = require('./toArray')
3var map = require('./map')
4
5var isArray = require('./isArray')
6var isFunction = require('./isFunction')
7var isPlainObject = require('./isPlainObject')
8var isUndefined = require('./isUndefined')
9var isNull = require('./isNull')
10var eqNull = require('./eqNull')
11var get = require('./get')
12var property = require('./property')
13
14var ORDER_PROP_ASC = 'asc'
15var ORDER_PROP_DESC = 'desc'
16
17// function handleSort (v1, v2) {
18// return v1 > v2 ? 1 : -1
19// }
20
21// '' < 数字 < 字符 < null < undefined
22function 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
32function 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
43function 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 */
79function 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
102module.exports = orderBy