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

Posted

技术标签:

【中文标题】在Javascript中组合多个值的数字范围【英文标题】:Combining number ranges out of several values in Javascript 【发布时间】:2017-06-24 21:14:51 【问题描述】:

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

假设有多个数组,例如[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】:

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

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

【讨论】:

你这么快就想到了?我现在感觉很愚蠢。谢谢妮娜。这正是我需要的。 不用担心。我实际上是在编写一种没有先排序的方法,最后一个 reduce 部分是我的起点。

以上是关于在Javascript中组合多个值的数字范围的主要内容,如果未能解决你的问题,请参考以下文章

带范围数的推荐组合算法

潘达斯:如何在一个范围之间找到值的索引?

如何制作一个在组合中发送多个值的发布者

在graphql中,组合多个源中的字段共享一个共同值的多个源的最佳方法是啥?

查找 JavaScript 数组值的所有组合(笛卡尔积)

QT 中 QDoubleSpinBoxes 的多个范围