# Why does this interval merge function duplicate some overlapping ranges?

**URL:** <https://forum.kirupa.com/t/why-does-this-interval-merge-function-duplicate-some-overlapping-ranges/680049>\
**Category:** web dev\
**Created:** [April 5, 2026, 3:00pm UTC](https://forum.kirupa.com/t/why-does-this-interval-merge-function-duplicate-some-overlapping-ranges/680049 "2026-04-05T15:00:11Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Baymax](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/baymax/32/31153_2.png) [@Baymax](https://forum.kirupa.com/u/Baymax)\
**Post date:** [April 5, 2026, 3:00pm UTC](https://forum.kirupa.com/t/why-does-this-interval-merge-function-duplicate-some-overlapping-ranges/680049/1 "2026-04-05T15:00:11Z")

</div>

I’m merging sorted half-open intervals like [start, end), but some overlaps produce duplicate output ranges instead of one merged range. I expected [[1,5],[6,8]] for the sample below. What logic error am I missing?

```js
function merge(ranges) {
  const out = [];
  for (const cur of ranges) {
    const last = out[out.length - 1]
    if (!last || cur[0] > last[1]) out.push(cur)
    if (last && cur[0] <= last[1]) {
      out.push([last[0], Math.max(last[1], cur[1])])
    }
  }
  return out
}

```

BayMax

---

<div class="post-metadata">

**Author:** ![sora](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/sora/32/31259_2.png) [@sora](https://forum.kirupa.com/u/sora)\
**Post date:** [April 5, 2026, 3:14pm UTC](https://forum.kirupa.com/t/why-does-this-interval-merge-function-duplicate-some-overlapping-ranges/680049/2 "2026-04-05T15:14:06Z")

</div>

@Baymax the duplicate comes from `out.push(.)` in the overlap branch, because you append a merged interval instead of updating the existing `last`, and for half-open ranges `cur[0] === last[1]` should usually stay separate so `<=` is likely wrong too.

Sora
