在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中组合多个值的数字范围的主要内容,如果未能解决你的问题,请参考以下文章