javascript - 结合Javascript中几个值的数字范围

标签 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 继续。

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

最佳答案

您可以使用链式方法来更改数据结构、排序和重新组装连接的部分。

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

关于javascript - 结合Javascript中几个值的数字范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093036/

相关文章:

python - 使用 Delaunay 三角剖分加速 Python MST 计算

c++ - 如何在 C++ 中消除 vector 的 "doubled"元素

c - C 中返回结构体指针数组的函数签名的语法是什么?

计算未排序数据中唯一对和非唯一对实例的数量

javascript - 如何让 VS Code 识别 ES7 绑定(bind)运算符

javascript - PHP jQuery HTML 表单插入到 MySQL 然后停留在同一页面上

JavaScript Closure - 监听类中所有元素的事件

javascript - Angular 2 将 HTML 注入(inject)内联模板

javascript - 将数组拆分为 block / block 并对其进行一一操作

algorithm - 给定两组(大)点,我如何有效地找到彼此最近的点对?