JavaScript从点状版本数组中找到最高版本

obj*_*ass 1 javascript arrays

我有一系列的版本号,如下所示:

[
  {
    "name": "v12.3.0.pre",
  },
  {
    "name": "v12.2.5",
  },
  {
    "name": "v12.2.4",
  },
  {
    "name": "v12.2.3",
  },
  {
    "name": "v12.2.1",
  },
  {
    "name": "v12.2.0",
  },
  {
    "name": "v12.2.0.pre",
  },
  {
    "name": "v12.2.0-rc32",
  },
  {
    "name": "v12.2.0-rc31",
  },
  {
    "name": "v12.1.9",
  },
  {
    "name": "v12.1.8",
  },
  {
    "name": "v12.1.6",
  },
  {
    "name": "v12.1.4",
  },
  {
    "name": "v12.1.3",
  },
  {
    "name": "v12.1.2",
  },
  {
    "name": "v12.1.1",
  },
  {
    "name": "v12.1.0",
  },
  {
    "name": "v12.1.0.pre",
  },
  {
    "name": "v12.1.0-rc23",
  },
  {
    "name": "v12.1.0-rc22",
  },
  {
    "name": "v12.0.9",
  },
  {
    "name": "v12.0.8",
  },
  {
    "name": "v12.0.6",
  },
  {
    "name": "v12.0.4",
  },
  {
    "name": "v12.0.3",
  },
  {
    "name": "v12.0.2",
  },
  {
    "name": "v12.0.1",
  },
  {
    "name": "v12.0.0",
  },
  {
    "name": "v11.12.0.pre",
  },
  {
    "name": "v11.11.8",
  }
]
Run Code Online (Sandbox Code Playgroud)

从这个数组中,我想确定最新版本,该版本不以“ .pre”结尾或包含“ rc”。

我使用for循环遍历数组,并使用if语句过滤掉“ .pre”和“ rc”。然后,我使用split / join删除第一个“ v”字符。到目前为止,一切都很好。然后我剩下的值是'12 .2.5'和'11 .12.10'。我首先想到了删除点,然后使用“大于”运算符查看找到最大值,但随后的“ 11.12.10(111210)”将大于“ 12.2.5(1225)”,这将无法解决就我而言。

for(i in arr){
    if(!arr[i].name.endsWith('.pre') && !arr[i].name.includes('rc')){
        var number = number.split('v').join("");
        var number = number.split('.').join("");
    }
}
Run Code Online (Sandbox Code Playgroud)

有关解决此问题的最佳方法的任何想法?谢谢!

Nin*_*olz 6

您可以String#localeCompare选择获得结果的选项。

var data = [{ name: "v12.3.0.pre" }, { name: "v12.2.5" }, { name: "v12.2.4" }, { name: "v12.2.3" }, { name: "v12.2.1" }, { name: "v12.2.0" }, { name: "v12.2.0.pre" }, { name: "v12.2.0-rc32" }, { name: "v12.2.0-rc31" }, { name: "v12.1.9" }, { name: "v12.1.8" }, { name: "v12.1.6" }, { name: "v12.1.4" }, { name: "v12.1.3" }, { name: "v12.1.2" }, { name: "v12.1.1" }, { name: "v12.1.0" }, { name: "v12.1.0.pre" }, { name: "v12.1.0-rc23" }, { name: "v12.1.0-rc22" }, { name: "v12.0.9" }, { name: "v12.0.8" }, { name: "v12.0.6" }, { name: "v12.0.4" }, { name: "v12.0.3" }, { name: "v12.0.2" }, { name: "v12.0.1" }, { name: "v12.0.0" }, { name: "v11.12.0.pre" }, { name: "v11.11.8" }],
    highest = data
        .filter(({ name }) => !name.endsWith('.pre') && !name.includes('rc'))
        .reduce((a, b) =>
            0 < a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' })
                ? a
                : b
        );

console.log(highest);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)