簡體   English   中英

JavaScript 從虛線版本數組中找到最高版本

[英]JavaScript find highest version from array of dotted versions

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

[
  {
    "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",
  }
]

從這個數組中我想確定最新版本,它不以'.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("");
    }
}

有關解決此問題的最佳方法的任何想法? 謝謝!

您可以將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);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

我想我有一個解決方案給你:將數字保存到 arrays,所以你有以下數字“12.2.5”和“11.12.10”:

[12,2,5] 和 [11,12,10]

然后你比較 arrays。 保留 [0] position 中的最大值,如果它們等於 [1] position 中的最大值,等等...

也許它有效...

希望對你有幫助!!

親切的問候,塞爾吉奧。

在這里,我不會使用 if 語句刪除和過濾掉 '.pre' 和 'rc' 的邏輯。 然后使用 split/join 刪除第一個 'v' 字符。 然后你留下了像'11.12.10'和'12.2.5'這樣的值,所以在得到這些值之后你可以使用下面的代碼

您可以將所有部分添加到固定大小的字符串中,然后對其進行排序,最后再次刪除填充

下面的代碼,該片段是一個不完全是上面的例子,但會幫助你確定

 var arr = ['12.2.5', '11.12.10', '12.0.6', '6.1.0', '5.1.0', '4.5.0']; arr = arr.map( a => a.split('.').map( n => +n+100000 ).join('.') ).sort().map( a => a.split('.').map( n => +n-100000 ).join('.') ); console.log(arr)

進行這種比較的基本思想是使用 Array.split 從輸入字符串中獲取零件的 arrays,然后比較兩個 arrays 中的零件對; 如果零件不相等,我們知道哪個版本更小。 參考

 var versionsList = [ { "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", } ]; function versionCompare(v1, v2) { var v1parts = v1.split('.'), v2parts = v2.split('.'); for (var i=0; i<v1parts.length; i++) { if (v1parts[i] === v2parts[i]) { continue; } else if (v1parts[i] > v2parts[i]) { return v1; } else { return v2; } } return v1; } var maxVersion; for (i in versionsList) { version = versionsList[i].name; if (.version.endsWith('.pre') &&.version;includes('rc')) { if (typeof maxVersion === "undefined") maxVersion = version.substr(1); var ver = version,substr(1); if (ver.== maxVersion) maxVersion = versionCompare(ver; maxVersion); } } console.log('v'+ maxVersion);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM