从排序的整数数组中创建字符串范围

Kam*_*ski 11 javascript grouping

我有以下排序的数字数组(它们可以重复,例如21)

let a = [1,2,3,4,7,8,12,15,21,21,22,23]
Run Code Online (Sandbox Code Playgroud)

并希望获得具有范围的跟随(排序)字符串数组

let r =["1-4","7-8","12","15","21-23"]
Run Code Online (Sandbox Code Playgroud)

对于连续的数字a,a + 1,a + 2,...,a + n = bw必须创建字符串"ab",例如对于6,7,8我们想得到"6-8",对于"单独"数字我们只想获得那个数字,例如在上面的例子中我们得到"12".

这是我的尝试,但我坚持下去(并让头痛)

let a = [1,2,3,6,7,8,12,15,21,21,22,23];
let right=a[0];
let left=a[0];
let result=[];

for(let i=1; i<a.length; i++) {
	for(let j=1; j<a.length; j++) {
      if(a[i]<a[j])result.push(`${a[i]}-${a[j]}`);
      
  }
}

console.log(JSON.stringify(result));
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 7

您可以将下一个期望值存储在闭包中并减少数组.

function getRanges(array) {
    return array.reduce((l => (r, v, i, a) => {
        if (l[1] > v) return r;
        r.push(l[1] === v
            ? (r.pop(), l.join('-'))
            : (l = [v, v]).slice(0, 1).toString()
        );
        l[1]++;
        return r;
    })([]), []);
}

console.log(getRanges([-3, -2, -1, 2]));
console.log(getRanges([1, 2, 3, 4, 7, 8, 12, 15, 21, 21, 22, 23]));
Run Code Online (Sandbox Code Playgroud)