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



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

sets (not a partition): [[0,8], [6,15], [14,25]]
findInSets : 7 -> [0, 1]
findInSets : 30 -> []

// findInSets :: number -> array-{indexes}
const isInRange = (x = 0, [a, b] = [0, 1]) => ([a, b] = [a, b].sort((a, b) => a > b)) && (x >= a && x <= b),
  findInSets = (x = 0, sets = [
    [0, 1]
  ]) => sets.map((subset, index) => (isInRange(x, subset)) ? index : -1).filter(index => index > -1);
console.log(
  findInSets(7, [
    [8, 0],
    [6, 15],
    [14, 25],
    [99, 0]
  ])
);

有了es6魔法,它能(甚至(更整洁吗? es6太有趣了!

您可以使用Math.minMath.max而不对内部数组进行排序,如果找到,则映射索引并仅过滤找到的索引。

var findInSets = (value, array) =>
        array.
            map((a, i) =>
                Math.min(...a) <= value && value <= Math.max(...a) ? i : -1).
            filter(a => a + 1);
console.log(findInSets(7, [[8, 0], [6, 15], [14, 25], [99, 0]]));

您可以使用reduce来获取所需的索引。

function findInSets(x, sets){
  return sets.reduce((ret, set, index) => {
     if(x >= Math.min.apply(Math, set) && x <= Math.max.apply(Math, set)){
          ret.push(index)
     }
     return ret;
 }, []);
}
console.log(
  findInSets(7, [
    [8, 0],
    [6, 15],
    [14, 25],
    [99, 0]
  ])
);

虽然这有效,但我不确定它的效率如何。

感谢您的贡献,我做了一些基准测试(http://jsben.ch/#/dszDn(。建立在Thomas(最快+功能(和Nina Scholz(传播op,很酷但非常无效(的基础上,我得到了这个功能:

const findInIntervals = (x, intvArr) => intvArr
                                        .filter(
                                          (intv) => Math.min(...intv) <= x && x <= Math.max(...intv)
                                        ).map(intv => intvArr.indexOf(intv));

2017/04 注意事项:如果您正在寻找速度,请避免使用点差运算符并使用 Thomas 的版本。

最新更新