Javascript 包含给定数字的闭合区间数组中的索引

Javascript 包含给定数字的闭合区间数组中的索引,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在寻找一种通用的方法来查找给定的数字何时包含在闭合区间数组(包括端点)的区间中,并报告这些区间的索引。我得到了这个: sets (not a partition): [[0,8], [6,15], [14,25]] findInSets : 7 -> [0, 1] findInSets : 30 -> [] //findInSets::number->array-{index} 常量isInRange=(x=0,[a,b]=[0,1])=>([a,b]=[a,b]。排序((a

我正在寻找一种通用的方法来查找给定的数字何时包含在闭合区间数组(包括端点)的区间中,并报告这些区间的索引。我得到了这个:

sets (not a partition): [[0,8], [6,15], [14,25]]
findInSets : 7 -> [0, 1]
findInSets : 30 -> []
//findInSets::number->array-{index}
常量isInRange=(x=0,[a,b]=[0,1])=>([a,b]=[a,b]。排序((a,b)=>a>b))&&&(x>=a&&x集。映射((子集,索引)=>(isInRange(x,子集))?索引:-1。过滤器(索引=>index>-1);
console.log(
Findinset(7[
[8, 0],
[6, 15],
[14, 25],
[99, 0]
])

);
您可以使用
Math.min
Math.max
而无需对内部数组进行排序,并在找到索引时映射索引,只过滤找到的索引

var findInSets=(值,数组)=>
数组。
地图((a,i)=>

Math.min(…a)您可以使用
reduce
获得所需的索引

函数findinset(x,set){
返回集合。减少((返回、集合、索引)=>{

如果(x>=Math.min.apply(Math,set)&&x多亏了您的贡献,我在Thomas(最快+功能)和Nina Scholz(spread op,酷但非常无效)的基础上创建了这个函数:

const findininterval=(x,intvArr)=>intvArr
.过滤器(

(intv)=>Math.min(…intv)您可以尝试
Array.reduce
而不是
.map
+
.filter
。也不确定这是否是它的正确位置(偶数)整洁?如果你真的是指集合,为什么要关心索引呢?集合本身就是无序的。你实际上可以使用es6
set
而不是数组。
const contains=x=>([a,b])=>x>=a&&x=b&&x set.filter(contains(x)).map(set=>set.indexOf(set));
@Touffy我在用数学的方式思考。我指的是间隔(这是一种集合)。早茶…@Thomas非常有趣的模式。我在寻找一种可以使用
Array.prototype.findIndex()
的方法,但我没有想到
Array.prototype.indexOf()
。我想如果你现在喝了早茶,你用这个词,你的问题会更容易理解“interval”在其中。这里另一个有用的词是“array”,您最终可以将您的结构描述为一个interval数组,更有用的是,告诉我们interval是否包含任一端(8包含在
[0,8]
?)。我喜欢reduce(=映射+过滤器,这里),但为什么要费心使用
函数。prototype.apply()
?@hsolatges本能,我不太习惯
扩展语法
…iterableObject
。看起来@Thomas版本比你我的快。我猜这是因为他在映射之前进行过滤。感谢扩展元素的想法(即使它非常慢)!