2016-12-29 73 views
3

我有兩個數字範圍。 可以說,第一次的憤怒是6-9,第二次是1-15比較javascript中的兩個數字範圍

我需要檢查,如果它是衝突。我的意思是如果1-15正在穿越6-9, 有效範圍是 1-5, 10-15 但是1-15,2-18像這樣應該返回我它違反了6-9。

目前我只檢查勁兒位,如果它落在範圍之間,

if (typeof (Number.prototype.isBetween) === "undefined") { 
    Number.prototype.isBetween = function (min, max, notBoundaries) { 
     var between = false; 
     if (notBoundaries) { 
      if ((this < max) && (this > min)) between = true; 
      alert('notBoundaries'); 
     } else { 
      if ((this <= max) && (this >= min)) between = true; 
      alert('Boundaries'); 
     } 
     alert('here'); 
     return between; 
    } 
} 

但現在我需要檢查的範圍。任何幫助表示讚賞

+0

以陣列的形式在這些範圍? – anu

+0

可以說第二個範圍是'a到b' ...您需要檢查'a'是否在測試範圍內,或者'b'是否在測試範圍內OR'(a'低於測試範圍AND'b '超出測試範圍)......這有幫助嗎? –

+0

@anu是範圍是以數組的形式。 –

回答

2

利用你的函數,我添加了一個新功能,比較範圍

if (typeof (Number.prototype.isBetween) === "undefined") { 
 
    Number.prototype.isBetween = function (min, max, notBoundaries) { 
 
     var between = false; 
 
     if (notBoundaries) { 
 
      if ((this < max) && (this > min)) between = true; 
 
     } else { 
 
      if ((this <= max) && (this >= min)) between = true; 
 
     } 
 
     return between; 
 
    } 
 
} 
 

 
if (typeof (Array.prototype.isRangeCrossed) === "undefined") { 
 
    Array.prototype.isRangeCrossed = function (target,notBoundaries) { 
 
     var result = false; 
 
     if ((target[0].isBetween(this[0],this[1],notBoundaries)) || (target[1].isBetween(this[0],this[1],notBoundaries))){ 
 
      result = true; 
 
     } 
 
     return result; 
 
    } 
 
} 
 

 

 
var range1 = [6,9]; 
 
var range2 = [1,15]; 
 
var range3 = [2,5]; 
 
console.log(range2.isRangeCrossed(range1,false)); 
 
console.log(range3.isRangeCrossed(range1,false));

+0

這個工作很好,但仍然有一個像Range1 4到9和Range2 6到8,這是失敗的問題 –

+0

[ 4,9]和[6,8]失敗 –

+0

是否有任何解決方案來獲得這個完美的.. –

1

如果你想要一個純粹的功能,這應該足夠了:

var rangesOverlap = function(n1, n2, r1, r2, boundaries) { 
    if (boundaries) { 
     return n1 >= n2 || n2 >= r1 || r1 >= r2; 
    } else { 
     return n1 > n2 || n2 > r1 || r1 > r2; 
    } 
} 

n1n2在第一範圍,r1r2是第二範圍,boundaries註明的邊界上允許重疊。

Array原型,其中comp是第二範圍數組:

Array.prototype.rangesOverlap = function(comp, boundaries) { 
    if (boundaries) { 
    return this[0] > this[1] || this[1] > comp[0] || comp[0] > comp[1]; 
    } else { 
    return this[0] >= this[1] || this[1] >= comp[0] || comp[0] >= comp[1]; 
    } 
} 

用於工作實施例,請參閱本JSFiddle

+0

不理解問題,但它總是給出範圍重疊,即使不是。你能再請檢查 –

+0

例如,[5,10]和[2,4]它說範圍重疊 –

0

您可以簡化範圍檢查代碼。

if (typeof(Number.prototype.isBetween) === 'undefined') { 
 
    Number.prototype.isBetween = function(min, max, inclusive) { 
 
    return inclusive ? (this <= max && this >= min) : (this < max && this > min); 
 
    } 
 
} 
 

 
var range = { min : 7, max : 12 }; 
 
var validMinInclusive = range.min.isBetween(range.min, range.max, true); 
 
var validMaxInclusive = range.max.isBetween(range.min, range.max, true); 
 
var invalidMinExclusive = range.min.isBetween(range.min, range.max, false); 
 
var invalidMaxExclusive = range.max.isBetween(range.min, range.max, false); 
 

 
console.log(validMinInclusive, validMaxInclusive, invalidMinExclusive, invalidMaxExclusive);

以下代碼構造Range對象具有用於如果另一個範圍在其內部裝配檢查的方法。有一個包含在上面代碼中的標誌。

function Range(min, max) { 
 
    if (arguments.length === 0) { 
 
    throw 'Range must include at least one value.'; 
 
    } 
 
    if (arguments.length === 1) { 
 
    max = min; 
 
    min = 0; 
 
    } 
 
    this.min = min; 
 
    this.max = max; 
 
} 
 
Range.inBounds = function(outer, inner, inclusive) { 
 
    return inclusive 
 
    ? (inner.min >= outer.min && inner.max <= outer.max) 
 
    : (inner.min > outer.min && inner.max < outer.max); 
 
}; 
 
Range.prototype.inBounds = function(target, inclusive) { 
 
    return Range.inBounds(this, target, inclusive); 
 
}; 
 

 
var rangeInner = new Range(6, 9); 
 
var rangeOuter = new Range(1, 15); 
 

 
var validRangeBounds = rangeOuter.inBounds(rangeInner, false); // true 
 
var invalidRangeBounds = rangeInner.inBounds(rangeOuter, false); // false 
 

 
console.log(validRangeBounds, invalidRangeBounds);