2017-02-02 54 views
1

我發現了類似的問題,但已批准的答案對我的問題無效。使用javascript合併數組中具有區間屬性的重疊對象

我有一個輸入:的範圍對象數組每個包含:

  • 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 }, 
] 

輸出:

[ 
    { start: 2, end: 7 }, 
    { start: 8, end: 12 } 
] 

正如我所提到的,我嘗試過在Web上應用解決方案來合併重疊間隔,但他們沒有完成這項工作。

謝謝。

回答

0

您可以按startend排序數組,並重復排序的數組,並檢查範圍是否重疊。

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

var ranges = [ 
 
    { start: 8, end: 10 }, 
 
    { start: 5, end: 7 }, 
 
    { start: 9, end: 12 }, 
 
    { start: 2, end: 6 } 
 
]; 
 

 

 
function merge(ranges) { 
 
    // first, sort the ranges 
 
    ranges.sort((a, b) => a.start - b.start); 
 
    
 
    // take two ranges, and merges them together 
 
    var mergeFn = (a, b) => ({start: Math.min(a.start, b.start), end: Math.max(a.end, b.end)}); 
 
    
 
    // check if two ranges overlap 
 
    var overlapFn = (a, b) => (b.start <= a.end); 
 
    
 
    // make current the first item of the array (start the array from 1 to not check the first item against itself) 
 
    var current = ranges[0]; 
 
    var result = []; 
 
    for(var i = 1; i < ranges.length; i++) { 
 
    if(overlapFn(current, ranges[i])) // if the current range overlapping with this range 
 
     current = mergeFn(current, ranges[i]); // merge them into the current range 
 
    else { // if not 
 
     result.push(current); // add the current accumulated range as result 
 
     current = ranges[i]; // start accumulating another one from this range 
 
    } 
 
    } 
 
    result.push(current); // add the last result 
 

 
    return result; 
 
} 
 

 
console.log(merge(ranges));

+0

謝謝你,易卜拉欣。出於某種原因,您提供的代碼不適用於我(a和b無法被我正在處理的頁面上的驗證程序識別),但我在此看到您的代碼正常工作。我用Nina的代碼,它的工作。謝謝。 –

+0

不客氣!也許你的瀏覽器不支持**箭頭函數**(假設你的代碼是用於瀏覽器的)。 –

相關問題