编码技巧收集三 ~ 版本号比较

82 阅读1分钟

背景

给你两个版本号 version1 和 version2 ,请你比较它们。

  • 版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由多位数字组成,可能包含前导零 。

  • 每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。

  • 比较修订号时,只需比较忽略任何前导零后的整数值 。也就是说修订号1和修订号001相等 

  • 如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 1 。

  • 返回规则如下:如果 version1 > version2 返回 1,如果 version1 < version2 返回  true,除此之外返回 false。

  • 示例 1:
    输入:version1 = “1.01”  >  version2 = “1.001”
    输出:true

  • 示例 2:
    输入:version1 = “1.01” =  version2 = “1.001”
    输出:false

  • 示例 3:
    输入:version1 = “1.01” < version2 = “1.001”
    输出:false

function each(obj, fn, context) {
    if (!obj || !(typeof fn === 'function')) {
        return
    }
    context = context || obj

    if (Array.isArray(obj)) {
        for (let i = 0, l = obj.length; i < l; i++) {
            if (fn.call(context, obj[i], i, obj) === false) {
                return
            }
        }
    } else if (typeof obj === 'object') {
        for (let n in obj) {
            if (fn.call(context, obj[n], n, obj) === false) {
                return
            }
        }
    }
}

function parse(version) {
    const parts = version.split('.')
    parts.length = 4

    const ret = []
    each(parts, n => {
        n = n * 1
        if (n) {
            ret.push(n >= 10 ? n : '0' + n)
        } else {
            ret.push('00')
        }
    })
    return parseInt(ret.join(''), 10)

}

function compareVersion(v1, symbol, v2) {

    const _v1 = parse(v1)
    const _v2 = parse(v2)

    if (symbol.indexOf('=') !== -1 && _v1 === _v2) {
        return true
    }
    if (symbol.indexOf('>') !== -1 && _v1 > _v2) {
        return true
    }
    if (symbol.indexOf('<') !== -1 && _v1 < _v2) {
        return true
    }
    return false
}