function sortVersion(list) {
// 将字符串转换成数字数组
let sList = list.map(item => item.split('.'))
// 获取最终的结果
function getRes(list) {
// 排序
let sortList = list.sort((a, b) => a[0] - b[0])
let res = []
// 用来记录当前版本
let current = {
value: undefined, // 前一个数据的版本值
arr: [], // 记录相同版本号的列表
}
// 遍历排序结果
for (let i = 0; i < sortList.length; i++) {
let item = sortList[i]
let first = item[0]
// 后面一个版本存在相同
if (first !== undefined && current.value !== undefined && current.value === first) {
current.arr.push(item.slice(1))
} else {
let arr = current.arr
let value = current.value
if (arr.length > 1) {
let temp = getRes(current.arr)
res = res.concat(temp.map(item => [value, ...item || []]))
} else if (arr.length === 1) {
res.push(current.item)
}
current = {
value: first,
arr: [item.slice(1)],
item: item
}
}
// 处理最后一个
if (i === sortList.length - 1) {
let arr = current.arr
let value = current.value
if (arr.length > 1) {
let temp = getRes(current.arr)
res = res.concat(temp.map(item => [value, ...item || []]))
} else {
res.push(current.item)
}
}
}
return res
}
// 恢复成字符串
return getRes(sList).map(item => item.join('.'))
}
function testSortVersion() {
function getRandomNum() {
return Math.round(Math.random() * 10)
}
// 随机生成版本号
var len = getRandomNum()
len = len < 3 ? 3 : len
var versions = new Array(len).fill(0).map(item => {
let len = getRandomNum()
len = len < 3 ? 3 : len
return new Array(len).fill(0).reduce((res, item, index) => {
let random = getRandomNum()
return res += index === 0 ? random : `.${random}`
}, '')
})
console.group()
console.log('排序前:', versions)
let sortVersions = sortVersion(versions)
console.log('排序后:', sortVersions)
console.groupEnd()
}
testSortVersion()
console