const merge = intervals => {
  // Step 1: Sort intervals based on start time
  intervals.sort((a, b) => a[0] - b[0]);

  // Step 2: Initialize result array
  const mergedIntervals = [];

  // Step 3: Iterate over intervals
  for (let i = 0; i < intervals.length; i++) {
    const currInterval = intervals[i];

    // Step 4: If no overlap, add to result array
    if (mergedIntervals.length === 0 || mergedIntervals[mergedIntervals.length - 1][1] < currInterval[0]) {
      mergedIntervals.push(currInterval);
    }
    // Step 5: If overlap, update end time of previous merged interval
    else {
      mergedIntervals[mergedIntervals.length - 1][1] = Math.max(mergedIntervals[mergedIntervals.length - 1][1], currInterval[1]);
    }
  }

  // Step 6: Return result array
  return mergedIntervals;
};

// Example usage
const intervals = [[1, 3], [2, 6], [8, 10], [15, 18]];
const merged = merge(intervals);
console.log(merged);