Javascript可以找出基于数字形成的自然群体数量?

时间:2017-05-18 14:27:05

标签: javascript math

我有很多数字:

[1, 2, 3, 4, 20, 20, 20, 35, 34, 60, 60, 61, 62]

我正在寻找一个可以对这些数字进行分组的函数,以便函数的输出为:

1-42034-3560-62如果我指定我希望将4个组传递给该函数。

2 个答案:

答案 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);