使用javascript合并数组中具有间隔属性的重叠对象

Dra*_*vic 2 javascript arrays object

我发现了类似的问题,但批准的答案不适用于我的问题。

我有一个输入:范围对象数组,每个对象包含:

  • start:整数,范围开始,
  • end:整数,范围结束。

输出应该是:

一个非重叠范​​围对象的数组,覆盖与输入相同的范围,从最小开始到最大开始排序。如果满足以下条件,则两个范围不重叠:

  • range1.start <= range2.start, 和
  • range1.end >= range2.start

输入:

[
  { start: 8, end: 10 },
  { start: 5, end: 7  },
  { start: 9, end: 12 },
  { start: 2, end: 6  },
]
Run Code Online (Sandbox Code Playgroud)

输出:

 [
   { start: 2, end: 7  },
   { start: 8, end: 12 }
 ]
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,我尝试在网络上应用解决方案来合并重叠间隔,但它们不起作用。

谢谢。

Nin*_*olz 5

start您可以按和对数组进行排序,end并迭代排序后的数组,检查范围是否重叠。

var data = [{ start: 8, end: 10 }, { start: 5, end: 7 }, { start: 9, end: 12 }, { start: 2, end: 6 }],
    result = data
        .sort(function (a, b) { return a.start - b.start || a.end - b.end; })
        .reduce(function (r, a) {
            var last = r[r.length - 1] || [];
            if (last.start <= a.start && a.start <= last.end) {
                if (last.end < a.end) {
                    last.end = a.end;
                }
                return r;
            }
            return r.concat(a);
        }, []);

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)