我有这样的JSON数据:
var jsondata = [
{
data: 'MacOS Sierra 10.12.13'
},
{
data: 'MacOS Sierra 10.12.5'
}
];
我需要在此阵列中选择最新版本的MacOS。如何更好地实施?我试图删除所有字母数字值并将mac版本转换为整数,但在某些情况下它可能不起作用(例如101213会大于10135)。
非常感谢您的帮助。
答案 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
表示可以轻松比较。
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;
然后,从数组中获取最新版本只需迭代该数组并存储最大值的索引和值。
这是一个更紧凑的版本:
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');