2016-12-29 2 views
3

У меня есть два ряда. Скажем, 1-я ярость 6-9, а вторая 1-15Сравните два числовых диапазона в javascript

Мне нужно проверить, если это противоречиво. Я имею в виду, если 1-15 пересекает 6-9, Допустимые диапазоны: 1-5, 10-15 , но 1-15, 2-18 как это должно вернуть мне, что он нарушает 6-9.

В настоящее время я только проверка signle цифра, если она попадает в интервал между диапазоном,

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' находится в пределах диапазона тестирования ИЛИ ('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; 
    } 
} 

n1 и n2 являются первым диапазоном, r1 и r2 являются вторым диапазоном, и 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);

Смежные вопросы