Javascript检查年份范围是否与其他范围冲突



那么,我有一个对象,有两个整数表示年份,像这样:

const targetRange = { from: 2015, to: 2020 };

然后我有一个数组与其他范围,像这样:

const currentRanges = [
{ from: 2003, to: 2006 },
{ from: 2006, to: 2010 },
{ from: 2010, to: 2014 },
{ from: 2014, to: 2019 },
]

我想创建一个函数rangesCollide,检查目标范围是否与任何当前范围发生碰撞。

例子:

rangesCollide({ from: 2010, to: 2015 }, { from: 2007, to: 2010 }); // false
rangesCollide({ from: 2010, to: 2015 }, { from: 2007, to: 2011 }); // true
rangesCollide({ from: 2010, to: 2015 }, { from: 2010, to: 2010 }); // false
rangesCollide({ from: 2010, to: 2015 }, { from: 2010, to: 2013 }); // true
rangesCollide({ from: 2010, to: 2015 }, { from: 2011, to: 2014 }); // true
rangesCollide({ from: 2010, to: 2015 }, { from: 2015, to: 2015 }); // false
rangesCollide({ from: 2010, to: 2015 }, { from: 2014, to: 2018 }); // true
rangesCollide({ from: 2010, to: 2015 }, { from: 2015, to: 2020 }); // false
rangesCollide({ from: 2010, to: 2015 }, { from: 2018, to: 2022 }); // false

我不知道该怎么做。

好的,我找到了这个:

求两条线段相交

基本上是相同的问题,这是解决方案:

function overlap(A1,A2,B1,B2) {
return A1<=B1?A2>=B1:B2>=A1;
}

但是我必须把<=和>=改成<和比;分别。>

我认为你可以使用some方法对数组的范围

const targetRange = { from: 2015, to: 2020 };
const currentRanges = [
{ from: 2003, to: 2006 },
{ from: 2006, to: 2010 },
{ from: 2010, to: 2014 },
{ from: 2014, to: 2019 },
];
const rangeConflicts = (f1, t1) => {
return currentRanges.some(({from: f, to: t}) => {
return (f1 >= f && f1 <= t) || (t1 >= f && t1 <= t);
});
};
console.log(rangeConflicts(targetRange.from, targetRange.to));

const rangesCollide = (target,other) => 
(target.to <= other.to) 
? !(target.to <= other.from)
: !(other.to <= target.from)

console.log(rangesCollide({ from: 2010, to: 2015 }, { from: 2011, to: 2014 }))
console.log(rangesCollide({ from: 2010, to: 2015 }, { from: 2015, to: 2015 }))
console.log(rangesCollide({ from: 2010, to: 2015 }, { from: 2014, to: 2018 }))

这里有两件事,首先要检查一个值是否存在于数组中。(array.prototype。一些方法[1]是完美的。第二个是范围是否冲突。

some方法接受一个函数作为参数,并将每个数组索引的值传递给该函数,该方法在返回true时结束,直到检查完数组中的每个值为止。

也就是说,我们不能编写碰撞检查函数来接受两个参数,因为它不能与some一起工作,而是使用curry函数,一个返回函数的函数。我们用目标值调用第一部分,some然后调用第二部分,直到找到匹配,或者检查数组中的每个值。

我在代码中添加了更多的目标范围,以测试碰撞逻辑是否如您所期望的那样工作。

const targetRange1 = { from: 2015, to: 2020 }
const targetRange2 = { from: 2000, to: 2022 }
const targetRange3 = { from: 2000, to: 2001 }
const targetRange4 = { from: 2020, to: 2021 }
const targetRange5 = { from: 2000, to: 2004 }
const targetRange6 = { from: 2015, to: 2016 }
const currentRanges = [
{ from: 2003, to: 2006 },
{ from: 2006, to: 2010 },
{ from: 2010, to: 2014 },
{ from: 2014, to: 2019 },
]
const rangesCollide = (r1) => (r2) => {
if ((r1.from > r2.from && r1.from < r2.to) || (r1.from <= r2.from && r1.to > r2.from)) {
return true
}
return false
}
const check1 = currentRanges.some(rangesCollide(targetRange1))
const check2 = currentRanges.some(rangesCollide(targetRange2))
const check3 = currentRanges.some(rangesCollide(targetRange3))
const check4 = currentRanges.some(rangesCollide(targetRange4))
const check5 = currentRanges.some(rangesCollide(targetRange5))
const check6 = currentRanges.some(rangesCollide(targetRange6))
document.querySelector('.p1').innerHTML = `check1 = ${check1}`
document.querySelector('.p2').innerHTML = `check2 = ${check2}`
document.querySelector('.p3').innerHTML = `check3 = ${check3}`
document.querySelector('.p4').innerHTML = `check4 = ${check4}`
document.querySelector('.p5').innerHTML = `check5 = ${check5}`
document.querySelector('.p6').innerHTML = `check6 = ${check6}`
<p class="p1"></p>
<p class="p2"></p>
<p class="p3"></p>
<p class="p4"></p>
<p class="p5"></p>
<p class="p6"></p>


[1]: https://developer.cdn.mozilla.net/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

最新更新