我有以下排序的数字数组(它们可以重复,例如21)
let a = [1,2,3,4,7,8,12,15,21,21,22,23]
并想获得带有范围的字符串的以下(排序的)字符串数组
let r =["1-4","7-8","12","15","21-23"]
对于连续数字a,a + 1,a + 2,...,a + n = bw必须创建字符串“ ab”,例如对于6,7,8,我们要获得“ 6-8”,对于“我们希望仅获取该数字,例如在上面的示例中,对于12,我们得到“ 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));
答案 0 :(得分: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]));
答案 1 :(得分:3)
这应该为你做。
const a = [1,2,3,4,7,8,12,15,21,21,22,23,27]
let min = a[0], last = a[0]
const result = a.reduce((arr, n, i) => {
if(n - last > 1){
if(min == last) arr.push(""+min)
else arr.push([min, last].join("-"))
min = n
}
if(i == a.length - 1) {
if(min == n) arr.push(""+min)
else arr.push([min, n].join("-"))
}
last = n
return arr
}, [])
console.log(result)
答案 2 :(得分:2)
您不需要两个循环,只需跟踪一下您是如何开始组的即可:
let array = [1,2,3,4,7,8,12,15,21,21,22,23]
const groups = [];
let start = array[0];
array.push(NaN);
for(let index = 1; index < array.length; index++) {
const value = array[index], previous = array[index - 1];
if(value === previous + 1 || value === previous)
continue;
if(start === previous) {
groups.push("" + previous);
} else {
groups.push(start + "-" + previous);
}
start = value;
}
console.log(groups);
答案 3 :(得分:2)
另一种方式可能是
{{1}}
答案 4 :(得分:0)
这也是我的答案(受其他答案的启发)
let r = (a,c='-',f=a[0],g=[]) => (a.map((x,i,a,b=a[i+1]) =>
b<=x+1 ? 0 : (g.push( f-x ? f+c+x : f+'' ),f=b) ),g);
let a = [1,2,3,4,7,8,12,15,21,21,22,23];
let b = [-7,-5,-4,-3,-1,0,1,3,4,5,8];
let r = (a,c='-',f=a[0],g=[]) => (a.map((x,i,a,b=a[i+1]) =>
b<=x+1 ? 0 : (g.push( f-x ? f+c+x : f+'' ),f=b) ),g);
let J= JSON.stringify;
console.log(J(a) + ' -> ' + J(r(a)));
console.log(J(b) + ' -> ' + J(r(b,'..')));
说明:g = []包含结果,第一个范围元素为f=a[0]
,开始时我们检查下一个元素b=a[i+1]
是否等于或小于当前元素x加一个b<=x+1
。如果为NO(表示范围结束或i
是最后一个索引-b = undefined),则将范围推入结果g.push( f-x ? f+'-'+x : f+'' )
(我们在此检查x是否等于f-x -> f-x!=0 -> f!=x
等于f) ,在将第一个范围元素f
设置为下一个范围(元素b
)之后。