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

bdo*_*nce 0 javascript

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

[1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19]
Run Code Online (Sandbox Code Playgroud)

注意一些数字是如何丢失的(在这种情况下,每5个数字).我想将连续数字转换为范围,由短划线分隔.

在上面的例子中,我想输出

"1-4,6-9,11-14,16-20"
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

roy*_*wie 5

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;
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个数组数组:

console.log(convertToRanges("1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19"));
// -> [ [1, 4], [6, 9], [11, 14], [16, 19] ]
Run Code Online (Sandbox Code Playgroud)

我会留给你弄清楚如何将其变换为看起来像 "1-4,6-9,11-14,16-20"

提示:使用Array.prototype.mapArray.prototype.join