@@ -92,43 +92,31 @@ function getTypeOf(obj) {
9292 return map [ toString . call ( obj ) ]
9393}
9494
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
112106 }
113- i += 1
114- }
115107
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+ } )
126115
127- // 需要移动
128- for ( let i = moveEnd ; i >= moveBegin ; i -= 1 ) {
129- arr [ i + 1 ] = arr [ i ]
116+ return {
117+ orderMap : map ,
118+ noOrderList ,
130119 }
131- arr [ pos ] = item
132120}
133121
134122/**
@@ -137,47 +125,53 @@ function insertItem(item, arr) {
137125 */
138126Utils . sortByOrder = ( source = [ ] ) => {
139127 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 ) {
141134 return source
142135 }
143- const tmp = [ ]
144- let target = [ ]
145136
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 )
159151
160- // 确保整数
161- source [ i ] . order = Math . floor ( order )
152+ const finallyArr = [ ]
153+ const gteZeroItemList = gteZeroOrders . map ( o => orderMap [ o ] ) . flat ( )
162154
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
165161 }
166162
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
175168 }
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
181175}
182176
183177/**
0 commit comments