Вот код в Swift, который должен работать. Должно быть легко перевести его на JavaScript (не очень знакомый мне).
Так как я не знал лучше и просто для удовольствия, я написал это рекурсивно, чтобы число подрывных действий было произвольным.
let versions = ["3.0", "1.0", "1.10.11", "3.1.5", "1.3.35", "1.2"]
// Convert your versions string to an array of versions, each represented by an array of ints. Store the version length
var versionLength = 0
var versionsInts: [[Int]] = []
for version in versions {
let versionComponents = version.components(separatedBy: ".")
if versionComponents.count > versionLength {
versionLength = versionComponents.count
}
var versionInts: [Int] = []
for versionComponent in versionComponents {
versionInts.append(Int(versionComponent)!)
}
versionsInts.append(versionInts)
}
// Make each int array of the same length
for index in 0 ..< versionsInts.count {
var versionInts = versionsInts[index]
for _ in versionInts.count ..< versionLength {
versionInts.append(0)
}
versionsInts[index] = versionInts
}
// Recursive helper function that compares 2 versions using a subindex
func cmp(version1: [Int], version2: [Int], subIndex: Int) -> Bool {
if subIndex == version1.count { return true } // Both versions are the same, take any
if version1[subIndex] < version2[subIndex] { return true } // ascending order
if version1[subIndex] > version2[subIndex] { return false } // descending order
return cmp(version1: version1, version2: version2, subIndex: subIndex+1) // If both versions up to now are the same, check next level
}
let sortedVersions = versionsInts.sorted(by: { (v1: [Int], v2: [Int]) -> Bool in
return cmp(version1: v1, version2: v2, subIndex: 0) // recursively check versions
})
Выход:
Printing description of sortedVersions:
▿ 6 elements
▿ 0 : 3 elements
- 0 : 1
- 1 : 0
- 2 : 0
▿ 1 : 3 elements
- 0 : 1
- 1 : 2
- 2 : 0
▿ 2 : 3 elements
- 0 : 1
- 1 : 3
- 2 : 35
▿ 3 : 3 elements
- 0 : 1
- 1 : 10
- 2 : 11
▿ 4 : 3 elements
- 0 : 3
- 1 : 0
- 2 : 0
▿ 5 : 3 elements
- 0 : 3
- 1 : 1
- 2 : 5