如何使用Node JS代码从特定版本之后的数组中获取版本列表?

时间:2018-11-09 13:10:21

标签: node.js optimization

我有一个数组,其中包含版本例如v4.5.3的堆栈列表

[ '64bit Amazon Linux 2018.03 v4.6.0 running Node.js',
      '64bit Amazon Linux 2018.03 v4.5.4 running Node.js',
      '64bit Amazon Linux 2018.03 v4.5.3 running Node.js',
      '64bit Amazon Linux 2018.03 v4.5.2 running Node.js',
      '64bit Amazon Linux 2018.03 v4.5.1 running Node.js',
      '64bit Amazon Linux 2018.03 v4.5.0 running Node.js',
      '64bit Amazon Linux 2017.09 v4.4.6 running Node.js',
      '64bit Amazon Linux v4.4.5 running Node.js',
      '64bit Amazon Linux v4.4.4 running Node.js',
      '64bit Amazon Linux 2017.09 v4.4.3 running Node.js',
      '64bit Amazon Linux 2017.09 v4.4.2 running Node.js',
      '64bit Amazon Linux 2017.09 v4.4.1 running Node.js',
      '64bit Amazon Linux 2017.09 v4.4.0 running Node.js',
      '64bit Amazon Linux 2017.03 v4.3.0 running Node.js',
      '64bit Amazon Linux 2017.03 v4.2.2 running Node.js',
      '64bit Amazon Linux 2017.03 v4.2.1 running Node.js',
      '64bit Amazon Linux 2017.03 v4.2.0 running Node.js']

我想获得64bit Amazon Linux 2018.03 v4.5.3 running Node.js之后的下一个最新版本

'64bit Amazon Linux 2018.03 v4.6.0 running Node.js',
'64bit Amazon Linux 2018.03 v4.5.4 running Node.js'

方法1:我所做的是我遍历了这个数组并找到了字符串"64bit Amazon Linux 2018.03 v4.5.3 running Node.js",之后,无论我推送到新数组的任何元素都是正确的方法?

方法2:我可以使用每个元素的拆分方式,并且可以找到v4.6.0,但问题是没有人保证这些版本将位于同一位置。

在Node JS中什么是最好的方法?

2 个答案:

答案 0 :(得分:1)

正如您在“方法2”中所说,我假设您已经获得了一个仅包含版本号的数组。您可以使用compare-versions

该库能够:

  

比较semver版本字符串以查找更大,相等或更少的字符串。

    var compareVersions = require('compare-versions');

    var versions = [
      '1.5.19',
      '1.2.3',
      '1.5.5'
    ]
    var sorted = versions.sort(compareVersions);
    /*
    [
      '1.2.3',
      '1.5.5',
      '1.5.19'
    ]
    */

答案 1 :(得分:1)

首先,您可以使用正则表达式来获取版本。

const myVersions = versions.map((str) => {
    let match = str.match(/v\d+.\d+.\d+/)[0];
    let temp = match.split('');
    temp.shift();
    match = temp.join('');
    return {
        semver: match,
        text: str
    };
});

这将以对象数组的形式返回版本,这些字段的字段像4.0.2这样,文本如'64bit Amazon Linux 2018.03 v4.0.2 running Node.js'

其次,您可以编写一个比较函数来根据版本号进行排序并获得所需的输出,也可以使用compare-versions库进行排序,而该库已经在其他答案中指定了

function myCompareFunc(v1, v2) {
    let [major1, minor1, patch1] = v1.semver.split('.').map(Number);
    let [major2, minor2, patch2] = v2.semver.split('.').map(Number);
    if (major1 > major2) {
        return -1;
    }
    else if (major2 > major1) {
        return 1;
    }
    else if (minor1 > minor2) {
        return -1;
    }
    else if (minor2 > minor1) {
        return 1;
    }
    else if (patch1 > patch2) {
        return -1;
    }
    else if (patch2 > patch1) {
        return 1;
    }
    else {
        return 0;
    }
}

myVersions.sort(myCompareFunc);
console.log(myVersions.map(ver=>ver.text));

演示

const versions = ['64bit Amazon Linux 2018.03 v4.6.0 running Node.js',
    '64bit Amazon Linux 2018.03 v4.5.4 running Node.js',
    '64bit Amazon Linux 2018.03 v4.5.3 running Node.js',
    '64bit Amazon Linux 2017.09 v4.4.6 running Node.js',
    '64bit Amazon Linux 2018.03 v4.5.2 running Node.js',
    '64bit Amazon Linux 2018.03 v4.5.0 running Node.js',
    '64bit Amazon Linux v4.4.5 running Node.js',
    '64bit Amazon Linux 2017.09 v4.4.3 running Node.js',
    '64bit Amazon Linux 2017.09 v4.4.2 running Node.js',
    '64bit Amazon Linux 2017.09 v4.4.1 running Node.js',
    '64bit Amazon Linux v4.4.4 running Node.js',
    '64bit Amazon Linux 2017.09 v4.4.0 running Node.js',
    '64bit Amazon Linux 2017.03 v4.3.0 running Node.js',
    '64bit Amazon Linux 2018.03 v4.5.1 running Node.js',
    '64bit Amazon Linux 2017.03 v4.2.2 running Node.js',
    '64bit Amazon Linux 2017.03 v4.2.1 running Node.js',
    '64bit Amazon Linux 2017.03 v4.2.0 running Node.js'];

const myVersions = versions.map((str) => {
    let match = str.match(/v\d+.\d+.\d+/)[0];
    let temp = match.split('');
    temp.shift();
    match = temp.join('');
    return {
        semver: match,
        text: str
    };
});


function myCompareFunc(v1, v2) {
    let [major1, minor1, patch1] = v1.semver.split('.').map(Number);
    let [major2, minor2, patch2] = v2.semver.split('.').map(Number);
    if (major1 > major2) {
        return -1;
    }
    else if (major2 > major1) {
        return 1;
    }
    else if (minor1 > minor2) {
        return -1;
    }
    else if (minor2 > minor1) {
        return 1;
    }
    else if (patch1 > patch2) {
        return -1;
    }
    else if (patch2 > patch1) {
        return 1;
    }
    else {
        return 0;
    }
}

myVersions.sort(myCompareFunc);
console.log(myVersions.map(ver=>ver.text));