语义化版本倒序
语义化版本倒序排列。
示例
输入:['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']
输出:['4.3.5', '4.3.4.5', '4.2', '2.3.3', '0.302.1', '0.1.1' ]
代码
javascript
// 输入:['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']
// 输出:['4.3.5', '4.3.4.5', '4.2', '2.3.3', '0.302.1', '0.1.1' ]
export function versionListSort (list) {
let listArr = list.map(x => x.split('.').map(x => Number(x)))
const maxLength = Math.max(...listArr.map(x => x.length))
let sortIndex = 0
while(sortIndex < maxLength) {
listArr = listArr.sort((a, b) => {
const aVal = a[sortIndex] || 0
const bVal = b[sortIndex] || 0
if (sortIndex > 0) {
if (a[sortIndex - 1] === b[sortIndex - 1]) {
return bVal - aVal
} else {
return 0
}
}
return bVal - aVal
})
sortIndex++
}
return listArr.map(x => x.join('.'))
}
typescript
// 输入:['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']
// 输出:['4.3.5', '4.3.4.5', '4.2', '2.3.3', '0.302.1', '0.1.1' ]
export function versionListSort (list: string[]): string[] {
let listArr = list.map(x => x.split('.').map(x => Number(x)))
const maxLength = Math.max(...listArr.map(x => x.length))
let sortIndex = 0
while(sortIndex < maxLength) {
listArr = listArr.sort((a, b) => {
const aVal = a[sortIndex] || 0
const bVal = b[sortIndex] || 0
if (sortIndex > 0) {
if (a[sortIndex - 1] === b[sortIndex - 1]) {
return bVal - aVal
} else {
return 0
}
}
return bVal - aVal
})
sortIndex++
}
return listArr.map(x => x.join('.'))
}
测试代码
ts
import { expect, test } from 'vitest'
import { versionListSort } from './typescript.ts'
import { versionListSort as versionListSortJs } from './javascript.js'
const versionList = ['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']
const versionListRes = ['4.3.5', '4.3.4.5', '4.2', '2.3.3', '0.302.1', '0.1.1']
test(`['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5'] toEqual ['4.3.5', '4.3.4.5', '4.2', '2.3.3', '0.302.1', '0.1.1']`, () => {
expect(versionListSort(versionList)).toEqual(versionListRes)
})
test(`['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5'] toEqual ['4.3.5', '4.3.4.5', '4.2', '2.3.3', '0.302.1', '0.1.1']`, () => {
expect(versionListSortJs(versionList)).toEqual(versionListRes)
})
const versionList1 = ['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5', '4.2.3']
const versionList1Res = ['4.3.5', '4.3.4.5', '4.2.3', '4.2', '2.3.3', '0.302.1', '0.1.1']
test(`['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5', '4.2.3'] toEqual ['4.3.5', '4.3.4.5', '4.2.3', '4.2', '2.3.3', '0.302.1', '0.1.1']`, () => {
expect(versionListSort(versionList1)).toEqual(versionList1Res)
})
test(`['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5', '4.2.3'] toEqual ['4.3.5', '4.3.4.5', '4.2.3', '4.2', '2.3.3', '0.302.1', '0.1.1']`, () => {
expect(versionListSortJs(versionList1)).toEqual(versionList1Res)
})