JSON中最新版本操作系统的Javascript检查

4ktjp1zp  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(131)

我有这样的JSON数据:

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

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

1l5u6lss

1l5u6lss1#

您可以将字符串拆分为一个数组,然后比较每个元素。我写了一个简单的函数来实现这一点。像这样的东西应该能用
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);
    }
5f0d552i

5f0d552i2#

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

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));

然后,要从数组中获取最新版本,只需迭代该数组并存储最大值的索引和值。
下面是一个更紧凑的版本:

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

ftf50wuq3#

您可以使用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');

相关问题