在Javascript中组合多个值中的数字范围

时间:2017-02-07 14:57:48

标签: javascript arrays algorithm numbers logic

我有一个合乎逻辑的挑战,我想知道什么是最佳实践或可能的方法或库来最好地解决问题。

我们假设有多个数组,例如[10, 20, 30] ["24-30", "45-60"] [34, 35] ["28-33", 90]

我想要的是单个范围和不同值的概述,没有任何冗余。因此,在上层数组中,应该生成一个包含所有值的单个排序数组,这些数组将合并为逻辑有序流。

例如,对于较高的值,我期望一个字符串

[10, 20, "24-35", "45-60", 90]

所以逻辑应该检测到,例如, 30已包含在[24-30]中,即" 28-33"继续并与" 24-30"重叠和" 28-33"单值34和35继续。

也许有人知道一个图书馆支持我这个问题或知道一个好的解决方案?

1 个答案:

答案 0 :(得分:1)

您可以使用链式方法更改数据结构,对重新组合连接的部件进行排序。



var data = [[10, 20, 30], ["24-30", "45-60"], [34, 35], ["28-33", 90]],
    result = data
        .reduce(function (r, a) {
            a.map(function (b) {
                var c = b.toString().split('-')
                c[1] = c[1] || c[0];
                r.push(c.map(Number));
            });
            return r;
        }, [])
        .sort(function (a, b) { return a[0] - b[0] || a[1] - b[1]; })
        .reduce(function (r, a) {
            var last = r[r.length - 1] || [];
            if (a[0] <= last[1] + 1) {
                if (last[1] < a[1]) {
                    last[1] = a[1];
                }
                return r;
            }
            return r.concat([a]);
        }, [])
        .map(function (a) {
            return a[0] === a[1] ? a[0] : a.join('-');
        });
    
console.log(result);
&#13;
&#13;
&#13;