@@ -92,43 +92,31 @@ function getTypeOf(obj) {
92
92
return map [ toString . call ( obj ) ]
93
93
}
94
94
95
- function insertItem ( item , arr ) {
96
- const { order } = item
97
- if ( ! arr [ order ] ) {
98
- arr [ order ] = item
99
- return
100
- }
101
- let moveBegin
102
- let moveEnd
103
- let pos
104
- let i = order + 1
105
-
106
- while ( arr [ i ] ) {
107
- if ( arr [ i ] . order > order ) {
108
- if ( ! moveBegin ) {
109
- moveBegin = i
110
- pos = i
111
- }
95
+ function groupByOrder ( source ) {
96
+ // 有order的放这里
97
+ const map = { }
98
+ // 没有order放这里
99
+ const noOrderList = [ ]
100
+
101
+ source . forEach ( s => {
102
+ const { order } = s
103
+ if ( typeof order !== 'number' ) {
104
+ noOrderList . push ( s )
105
+ return
112
106
}
113
- i += 1
114
- }
115
107
116
- if ( moveBegin ) {
117
- moveEnd = i
118
- } else {
119
- pos = i
120
- }
121
-
122
- if ( ! moveEnd ) {
123
- arr [ pos ] = item
124
- return
125
- }
108
+ const list = map [ order ]
109
+ if ( list ) {
110
+ list . push ( s )
111
+ } else {
112
+ map [ order ] = [ s ]
113
+ }
114
+ } )
126
115
127
- // 需要移动
128
- for ( let i = moveEnd ; i >= moveBegin ; i -= 1 ) {
129
- arr [ i + 1 ] = arr [ i ]
116
+ return {
117
+ orderMap : map ,
118
+ noOrderList ,
130
119
}
131
- arr [ pos ] = item
132
120
}
133
121
134
122
/**
@@ -137,47 +125,53 @@ function insertItem(item, arr) {
137
125
*/
138
126
Utils . sortByOrder = ( source = [ ] ) => {
139
127
if ( ! Array . isArray ( source ) ) {
140
- console . error ( 'sortByOrder 传入参数不符合要求, 应为数组' , source )
128
+ const message = 'sortByOrder 传入参数不符合要求, 应为数组'
129
+ console . error ( message )
130
+ throw new Error ( message )
131
+ }
132
+
133
+ if ( ! source . length ) {
141
134
return source
142
135
}
143
- const tmp = [ ]
144
- let target = [ ]
145
136
146
- // 将带排序的子项添加进临时数组 tmp
147
- for ( let i = 0 ; i < source . length ; i += 1 ) {
148
- if ( typeof source [ i ] . order !== 'number' ) {
149
- continue
150
- }
151
- let { order } = source [ i ]
152
- // 支持设置倒数顺序
153
- if ( order < 0 ) {
154
- order = source . length + order
155
- if ( order < 0 ) {
156
- order = 0
157
- }
158
- }
137
+ // 1.根据order对数据进行分组
138
+ const { orderMap, noOrderList } = groupByOrder ( source )
139
+
140
+ // 2.获取已存在的order
141
+ const orders = Object . keys ( orderMap ) . map ( o => Number ( o ) )
142
+
143
+ // 对order进行排序
144
+ orders . sort ( ( a , b ) => a - b )
145
+
146
+ // 小于0的order
147
+ const ltZeroOrders = orders . filter ( o => o < 0 )
148
+
149
+ // 大于等于0的order
150
+ const gteZeroOrders = orders . filter ( o => o >= 0 )
159
151
160
- // 确保整数
161
- source [ i ] . order = Math . floor ( order )
152
+ const finallyArr = [ ]
153
+ const gteZeroItemList = gteZeroOrders . map ( o => orderMap [ o ] ) . flat ( )
162
154
163
- // 插入临时数组
164
- insertItem ( source [ i ] , tmp )
155
+ finallyArr . push ( ...gteZeroItemList )
156
+ finallyArr . push ( ...noOrderList )
157
+
158
+ // 如果没有小于0的order,则直接拼接
159
+ if ( ! ltZeroOrders . length ) {
160
+ return finallyArr
165
161
}
166
162
167
- // 合并临时数组和原数组
168
- for ( let i = 0 , j = 0 ; i < source . length ; i += 1 ) {
169
- if ( typeof source [ i ] . order === 'number' ) {
170
- continue
171
- }
172
- // 找需要填的坑
173
- while ( tmp [ j ] ) {
174
- j += 1
163
+ // 将小于0的order的item插入到数组中
164
+ ltZeroOrders . reverse ( ) . forEach ( o => {
165
+ let index = finallyArr . length + o + 1
166
+ if ( index < 0 ) {
167
+ index = 0
175
168
}
176
- tmp [ j ] = source [ i ]
177
- }
178
- // 筛除空隙
179
- target = tmp . filter ( item => ! ! item )
180
- return target
169
+
170
+ const arr = orderMap [ o ]
171
+ finallyArr . splice ( index , 0 , ...arr )
172
+ } )
173
+
174
+ return finallyArr
181
175
}
182
176
183
177
/**
0 commit comments