Javascript在JSON中检查最新版本的OS

时间:2017-07-03 09:57:20

标签: javascript node.js

我有这样的JSON数据:

 var jsondata = [
{
   data: 'MacOS Sierra 10.12.13'
},
{
   data: 'MacOS Sierra 10.12.5'
}
];

我需要在此阵列中选择最新版本的MacOS。如何更好地实施?我试图删除所有字母数字值并将mac版本转换为整数,但在某些情况下它可能不起作用(例如101213会大于10135)。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以将字符串拆分为数组,然后比较每个元素。 我写了一个简单的函数来做到这一点。 这样的事情应该有效

https://jsfiddle.net/3xmjmjsb/8/

function compare_versions(ver1,ver2){

var version1=ver1.replace(/[^0-9.]/g, "").split('.');
var version2=ver2.replace(/[^0-9.]/g, "").split('.');

for (var i=0, l=version1.length; i<l; i++) { 

  if(parseInt(version1[i])>parseInt(version2[i])) 
  {return ver1;}
  else if(parseInt(version1[i])<parseInt(version2[i])) 
  {return ver2;}

}

return false;

}

并像这样使用

   var jsondata = [
{
   data: 'MacOS Sierra 10.12.13'
},
{
   data: 'MacOS Sierra 10.12.11'
}
];

var newest_version=compare_versions(jsondata[0]["data"],jsondata[1]["data"]);

    if(newest_version){
    alert(newest_version);
    }

答案 1 :(得分:0)

所以转换为integers的问题是,如果数字位数不同并且比较可能会给出错误的结果。您可以尝试向版本的每个部分添加填充,以便它们都具有相同的数字位数,连接部分然后只需比较数字。不确定这是最好的方法,另一个选择是按.拆分并单独比较每个部分,但第一种方法的优点是你可以获得每个版本的integer表示可以轻松比较。

&#13;
&#13;
    function getIntVersion(version) {
       // Remove non digits and non-points
       version = version.replace(/[^\d.]/g, '');
    
       var parts = version.split('.');
       // Make each part same length of 4, add 0 where necessary
       parts = parts.map(p => p.padEnd(4, '0'));
    
       version = parts.join('');
    
       return +version;
    }

    var version = 'MacOS Sierra 10.13.5';
    var version2 = 'MacOS Sierra 10.12.13';
    var intVersion = getIntVersion(version);
    var intVersion2 = getIntVersion(version2);

    console.log(intVersion + ' > ' + intVersion2, (intVersion > intVersion2));
&#13;
&#13;
&#13;

然后,从数组中获取最新版本只需迭代该数组并存储最大值的索引和值。

这是一个更紧凑的版本:

function getIntVersion(version) {
    return +version.replace(/[^\d.]/g, '').split('.').map(p => p.padEnd(4, '0')).join('');
}

答案 2 :(得分:0)

您可以使用semver模块:

npm上的4000多个其他模块使用此模块而不是重新实现版本解析,并且每月下载量超过2500万,它已经过广泛测试。

使用该模块您需要做的事情基本上是一行(为了便于阅读,分为3行)

const newest = jsondata
  .map(o => o.data.replace(/.* /, ''))
  .sort(semver.rcompare)[0];

现在console.log(newest);打印:10.12.13

或者如果你想保留整个对象:

const newest = jsondata
  .map(o => [o, o.data.replace(/.* /, '')])
  .sort((a, b) => semver.rcompare(a[1], b[1]))[0][0];

现在console.log(newest);打印:{ data: 'MacOS Sierra 10.12.13' }

请记住使用:const semver = require('semver');