SOURCE

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 命令行工具 X clear

                    
>
console