Skip to content

Commit f9cbcf4

Browse files
authored
fix: 重写Utils.sortByOrder()的实现,解决order负数排序异常的问题 (#488)
* fix: 修复路由“order”字段 数字 无法重复的bug * fix: 重写Utils.sortByOrder()的实现,解决order负数排序异常的问题
1 parent 09d27d7 commit f9cbcf4

File tree

1 file changed

+60
-66
lines changed

1 file changed

+60
-66
lines changed

src/lin/util/util.js

Lines changed: 60 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
138126
Utils.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

Comments
 (0)