首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分重叠范围

拆分重叠范围
EN

Stack Overflow用户
提问于 2017-09-26 22:50:59
回答 1查看 426关注 0票数 0

我已经实现了一个算法,用于将重叠的现有范围划分为日期/数字范围列表。

算法是有效的,但我想知道您是否可以避免算法的最后一次循环。

有可能吗?

Input Data

0-100(红色)90-150(绿色)90-150(蓝色)140-300(黄色)170-240(黑色)350-530(橙色)50-500(银色)50-60(粉色)

Output Data

0-49(红)50-60(红、银、粉)61-89(红、绿、蓝、银)90-100(红、绿、蓝、银)101-139(绿、蓝、银)140-150(绿、蓝、黄、银)151-169(黄、银)170-240(黄、黑、银)241-300(黄、银)301-349(银)350-500(橙色、银色)501-530(橙色)

Javascript代码:

代码语言:javascript
复制
    function splitRanges(original_intervals) {
    
        for (var to = [], from = [], n, i = original_intervals.length; i--;) {
            if (to.indexOf(n = original_intervals[i].to) < 0)
                to.push(n);
            if (from.indexOf(n = original_intervals[i].from) < 0)
                from.push(n);
        }
    
    
        to.sort(function(a, b) {
            return a - b;
        });
        from.sort(function(a, b) {
            return a - b;
        });
    
    
    
    
        var intervals = [];
        while (to.length) {
            var sFrom = from.shift();
            var sTo = 0;
            if (from.length == 0) {
                sTo = (from.push((n = to.shift()) + 1), n);
    
            } else {
                if (from[0] > to[0]) {
                    while (to[0] < from[0]) {
    
                        from.unshift(to[0] + 1);
                        to.shift();
    
                    }
    
                    sTo = from[0] - 1;
                } else {
                    sTo = from[0] - 1;
    
                }
            }
            intervals.push({
                from: sFrom,
                to: sTo,
                colors: []
            });
        }
    
        /***********************Loop that i want remove*/
    
        intervals.forEach(function(item, index) {
            original_intervals.forEach(function(item1, index1) {
                if ((item.from >= item1.from && item.from <= item1.to) || (item.to >= item1.from && item.to <= item1.to))
                    item.colors.push(item1.color);
            });
    
        });
    
        return intervals;
    }
    
    
    
    
    var r1 = [{
    id: 1,
    from: 0,
    to: 100,
	color:'red'
}, {
    id: 2,
    from: 90,
    to: 150,
	color:'green'
}, {
    id: 3,
    from: 90,
    to: 150,
	color:'blue'
}, {
    id: 4,
    from: 140,
    to: 300,
	color:'yellow'
}, {
    id: 5,
    from: 170,
    to: 240,
	color:'black'
}, {
    id: 6,
    from: 350,
    to: 530,
	color:'orange'
}, {
    id: 7,
    from: 50,
    to: 500,
	color:'silver'
}
, {
    id: 8,
    from: 50,
    to: 60,
	color:'pink'
}

];


console.log(splitRanges(r1));

EN

回答 1

Stack Overflow用户

发布于 2017-09-27 01:08:33

您需要一些迭代,至少是获得所有范围点的迭代,然后生成一个数组,并获取每个小间隔的颜色子集。

代码语言:javascript
复制
var data = [{ from: 0, to: 100, color: 'red' }, { from: 90, to: 150, color: 'green' }, { from: 90, to: 150, color: 'blue' }, { from: 140, to: 300, color: 'yellow' }, { from: 170, to: 240, color: 'black' }, { from: 350, to: 530, color: 'orange' }, { from: 50, to: 500, color: 'silver' }, { from: 50, to: 60, color: 'pink' }],
    ranges = new Set,
    parts,
    result;

data.forEach(({ from, to }) => (ranges.add(from), ranges.add(to)));
parts = [...ranges].sort((a, b) => a - b);
result = parts.slice(1).map(function (a, i, aa) {
    var from = i ? aa[i - 1] : parts[0],
        to = a,
        colors = data.filter(d => d.from <= from && to <= d.to).map(({ color }) => color);
    return { from, to, colors };
});
    
console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46429700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档