Javascript 如何将数字列表转换为连续数字范围的列表

Javascript 如何将数字列表转换为连续数字范围的列表,javascript,Javascript,我正在生成一个数字列表: [1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19] 注意一些数字是如何丢失的(在本例中,每5个数字)。我想把连续的数字转换成以破折号分隔的范围 在上述情况下,我希望输出为 "1-4,6-9,11-14,16-20" 我怎样才能着手解决这个问题 var convertToRanges = function (str) { // split the string at the commas and map it to an arr

我正在生成一个数字列表:

[1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19]
注意一些数字是如何丢失的(在本例中,每5个数字)。我想把连续的数字转换成以破折号分隔的范围

在上述情况下,我希望输出为

"1-4,6-9,11-14,16-20"
我怎样才能着手解决这个问题

var convertToRanges = function (str) {
    // split the string at the commas and map it to an array of ints
    // NOTE: if you are passing an array, skip this step
    var pieces = str.split(",").map(Number)
    // ranges will be an array of arrays
    // each inner array will have 2 dimensions, representing the start/end
    // of a range
    // we want to initialize our first range to pieces[0], pieces[0],
    // or (only the first element)
      , ranges = [[pieces[0], pieces[0]]]
    // last index we accessed (so we know which range to update)
      , lastIndex = 0;

    for (var i = 1; i < pieces.length; i++) {
        // if the current element is 1 away from the end of whichever range
        // we're currently in
        if (pieces[i] - ranges[lastIndex][1] === 1) {
            // update the end of that range to be this number
            ranges[lastIndex][1] = pieces[i];
        } else {
            // otherwise, add a new range to ranges
            ranges[++lastIndex] = [pieces[i], pieces[i]];
        }
    }
    return ranges;
}
我将把它留给您来解决如何将其转换为类似“1-4,6-9,11-14,16-20”

提示:使用和

我将把它留给您来解决如何将其转换为类似“1-4,6-9,11-14,16-20”


提示:使用和

解决方案返回完整的字符串并处理不属于范围的孤立数字

function convert(input) {
    var res = [],
        arr = typeof input == 'string' ? input.split(',').map(Number) : input;
    while (arr.length) {
        var curr = arr.shift(),
            lastIncIdx = null;

        if (arr.length && curr == arr[0] - 1) {
            var next = arr.length ? arr.reduce(function (last, curr, idx, arr) {
                if (curr == last + 1) {
                    lastIncIdx = idx;
                    return curr;
                } else {
                    return last;
                }
            }) : curr;

            if (next != curr) {
                arr.splice(0, lastIncIdx + 1);
                res.push(curr + '-' + next)
            }
        } else {
            res.push(curr)
        }
    }
    return res.join();
}

解决方案返回完整的字符串并处理不属于范围的孤立数字

function convert(input) {
    var res = [],
        arr = typeof input == 'string' ? input.split(',').map(Number) : input;
    while (arr.length) {
        var curr = arr.shift(),
            lastIncIdx = null;

        if (arr.length && curr == arr[0] - 1) {
            var next = arr.length ? arr.reduce(function (last, curr, idx, arr) {
                if (curr == last + 1) {
                    lastIncIdx = idx;
                    return curr;
                } else {
                    return last;
                }
            }) : curr;

            if (next != curr) {
                arr.splice(0, lastIncIdx + 1);
                res.push(curr + '-' + next)
            }
        } else {
            res.push(curr)
        }
    }
    return res.join();
}

我在谷歌上做了很多搜索,我不断地遇到RegEx,这是我还没有学会的东西,但在简要回顾它之后,根据我不断遇到的例子,我不能100%确定它是我问题的解决方案。我遇到了一个解决方案,在生成数字的循环中包含了大量if-else语句,这个想法几乎在我脑海中闪现,然而这个解决方案是用PHP编写的,试图破译并翻译成JS只会让我的大脑更加痛苦。基本上,我还没有尝试太多,因为一种方法还没有成功。我做过无数次谷歌搜索,不断遇到我还没有学会的RegEx,但在简要回顾它之后,根据我不断遇到的例子,我不能100%肯定它是解决我问题的方法。我遇到了一个解决方案,在生成数字的循环中包含了大量if-else语句,这个想法几乎在我脑海中闪现,然而这个解决方案是用PHP编写的,试图破译并翻译成JS只会让我的大脑更加痛苦。基本上,我还没有尝试太多,因为一种方法还没有成功。谢谢。我现在将研究这种方法。我应该注意到,这实际上是我写的第一篇JavaScript,这是我关于Stackoverflow的第一个问题。我以前唯一的经验就是学习各种在线课程。“范围”api似乎是我找不到的缺少的链接。非常感谢你的帮助@b你所说的
“range”api是什么意思?@b你可能见过这样声明的变量:
变量a=1,b=2,c=3。当您在不同的行上声明它们时,将逗号放在下一行(现在)被认为是良好的实践/惯例。这是给(你永远不要用的)。啊。这是有道理的。所以第4行使用的“var”也在第10行和第12行声明变量。杰出的非常感谢你的帮助!嘿,伙计。所以我得到了输出数组数组的代码。这是我第一次使用多维数组,也是第一次使用.map方法。在我回到你身边之前,我已经把这件事弄得一团糟好几天了。我不想复制和粘贴任何代码,但如果您能进一步指导我如何使用.map方法将[[1,4]、[6,9]、[11,14]、[16,19]]转换为“1-4,6-9,11-14,16-20”,我将不胜感激。我相信我理解.join方法的作用以及在这种情况下使用它的原因。谢谢。我现在将研究这种方法。我应该注意到,这实际上是我写的第一篇JavaScript,这是我关于Stackoverflow的第一个问题。我以前唯一的经验就是学习各种在线课程。“范围”api似乎是我找不到的缺少的链接。非常感谢你的帮助@b你所说的
“range”api是什么意思?@b你可能见过这样声明的变量:
变量a=1,b=2,c=3。当您在不同的行上声明它们时,将逗号放在下一行(现在)被认为是良好的实践/惯例。这是给(你永远不要用的)。啊。这是有道理的。所以第4行使用的“var”也在第10行和第12行声明变量。杰出的非常感谢你的帮助!嘿,伙计。所以我得到了输出数组数组的代码。这是我第一次使用多维数组,也是第一次使用.map方法。在我回到你身边之前,我已经把这件事弄得一团糟好几天了。我不想复制和粘贴任何代码,但如果您能进一步指导我如何使用.map方法将[[1,4]、[6,9]、[11,14]、[16,19]]转换为“1-4,6-9,11-14,16-20”,我将不胜感激。我相信我理解.join方法的作用以及在这种情况下使用它的原因。