我有很多数字:
[1, 2, 3, 4, 20, 20, 20, 35, 34, 60, 60, 61, 62]
我正在寻找一个可以对这些数字进行分组的函数,以便函数的输出为:
1-4
,20
,34-35
,60-62
如果我指定我希望将4个组传递给该函数。
答案 0 :(得分:3)
我有时间,所以我自己尝试了。以下是一个例子。我使用了一套来防止重复。我做的是
1. sort the array
2. construct a set
3. loop through all elements
3a. if first is assigned then
3a1. check first + 1 !== current el then
3a1_1. add to set, init first and reset step
3a2. else incr step
3b. else init current el as first
4. convert set to array
const a = [1,2,3,4,20,20,20, 35, 34, 60, 60, 61, 62];
// sort the numbers
const b = a.sort((el1, el2) => el1 - el2);
// use a set to prevent duplicates
const result = new Set();
let first, step = 1;
// loop through all els
for(let i = 0; i < b.length; ++i) {
if (first) {
if (first+step !== b[i]) {
result.add( (step === 1 ? first : first + '-' + b[i-1]) );
first = b[i];
step = 1;
}
else ++step;
}
else first = b[i];
}
console.log('before', a);
console.log('after', [...result]); // TADA !
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:2)
首先,您可以对给定数组进行排序,并检查是否实际值与前一个相同,然后退出循环。否则,检查是否值是真正的前任,然后为最后一个数组分配值,如果没有,则将新数组推送到结果集。
要获得合并结果,请映射连接的数组。
var data = [1, 2, 3, 4, 20, 20, 20, 35, 34, 60, 60, 61, 62].sort(function (a, b) { return a - b; }),
groups = data.reduce(function (r, a, i, aa) {
var last = r[r.length - 1] || [];
if (last[last.length - 1] === a) {
return r;
}
if (!i || last[last.length - 1] + 1 !== a) {
r.push([a]);
} else {
last[1] = a;
}
return r;
}, []).map(function (a) {
return a.join('-');
});
console.log(groups);