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

我有这样的JSON数据:

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

我需要在这个数组中select最新版本的MacOS。 如何实施更好? 我试图删除所有的字母数字值,并将mac版本转换为整数,但在某些情况下可能无法正常工作(例如101213会比10135大)。

会真的感谢你的帮助。

您可以将string拆分成数组,然后比较每个元素。 我写了一个简单的function来做到这一点。 像这样的东西应该工作

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

所以你转换为integers问题是,如果位数不一样,比较可能会给出错误的结果。 你可以尝试添加填充到版本的每个部分,所以他们都有相同的数字位数,join部分,然后简单地比较数字。 不知道这是最好的方法,但另一种select是分裂. 并单独比较每个部分,但第一种方法的优点是可以获得每个版本的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)); 

你可以使用这个semver模块:

在npm上有4000多个其他模块使用这个模块,而不是重新实现版本parsing,并且每月下载量超过2500万,这个模块的testing范围相当广泛。

有了这个模块,你需要做的事情基本上是一个单行(为了可读性分成三行)

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