我正在寻找一种通用的方法来查找给定数字是否包含在一系列封闭区间(包括终点)之间的间隔中,并报告这些区间的索引。我得到了这个:
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
非常有趣!
答案 0 :(得分:0)
您可以使用Math.min
和Math.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]]));
&#13;
答案 1 :(得分: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]
])
);
&#13;
虽然这有效,但我不确定它的效率如何。
答案 2 :(得分:0)
感谢您的贡献,我提出了some benchmarks (http://jsben.ch/#/dszDn)。建立在Thomas(最快+功能)和Nina Scholz(传播操作,很酷但非常无效)的基础上,我得到了这个功能:
const findInIntervals = (x, intvArr) => intvArr
.filter(
(intv) => Math.min(...intv) <= x && x <= Math.max(...intv)
).map(intv => intvArr.indexOf(intv));
关于2017/04的注意事项:如果您正在寻找速度,请避免传播操作员并使用Thomas的版本。