数组reduce函数,用于比较major.minor.patch字符串

时间:2019-08-20 18:26:09

标签: javascript arrays

我遇到了一些奇怪的事情,但是为什么它起作用却我还是不太明白。以下代码可以正常工作,并且始终返回最高版本,直到补丁程序级别为止。尽管我们将每个版本字符串都作为整数/数字进行比较。有人可以向我解释为什么它的行为方式如此吗?

var versionArr = ['4.2.2','4.2.1','3.1.0','3.2.1','3.0.0'];

console.log(versionArr.reduce((acc,item) => acc > item?acc:item));

1 个答案:

答案 0 :(得分:2)

在Javascript中比较字符串默认是按字典顺序比较它们。巧合的是,词典编目排序与语义版本排序的工作原理非常接近。它比较第一个字符,较大的数字比较小的数字“更大”。如果它们不同,则进行比较。如果它们相同,则转到第二个字符并再次进行比较。依此类推,直到遇到两个不同的字符。

因此,比较4.2.24.2.1,比较44,发现它们相同,然后比较.. ,看到它们相同,然后比较22,看到它们相同,比较..,发现它们相同,然后最后比较{ {1}}和2报告2大于1 ergo 1大于4.2.2

但是,这不适用于任何中等复杂的版本。例如,如果一个分量大于9,则会中断。比较4.2.110.0.0将报告9.0.0为较大的数字,因为9大于1。