Javascript 获取排序列表中输入值范围内的两个数字

Javascript 获取排序列表中输入值范围内的两个数字,javascript,Javascript,我想写一个函数,给定一个排序的数字列表和一个随机数X,它将返回一个新数组[Y,Z],这样Y就可以使用递归了: const getRange = ([a, b, ...xs], value) => xs.length === 0 || value < b ? [a, b] : getRange([b, ...xs], value); const getRange=([a,b,…xs],value)=> xs.length==0 | |值 范围。减少((r,v)=

我想写一个函数,给定一个排序的数字列表和一个随机数
X
,它将返回一个新数组
[Y,Z]
,这样
Y就可以使用递归了:

const getRange = ([a, b, ...xs], value) => 
  xs.length === 0 || value < b
    ? [a, b]
    : getRange([b, ...xs], value);
const getRange=([a,b,…xs],value)=>
xs.length==0 | |值
它的工作原理是与第二个元素进行比较,如果太小,则调用剩余的元素


我的重点是通过测试(我们称之为“测试驱动”),但有一些明显的边缘情况,您可能希望涵盖(例如,输入短于2个元素)

一种稍微不同的方法,但对于

getRange([0, 0.2, 0.7, 1], 0.2));     // [0.2, 0.7]
返回

[0, 0.2]
这是从两个值的增量小于给定结果的角度来看的

const
getRange=(范围,值)=>
范围。减少((r,v)=>
r、 长度<2
?r.concat(v)
:Math.abs(value-r[0])>=Math.abs(value-v)
?[r[r.长度-1],v]
:r
, []);
//介于两个值之间
log(getRange([0,0.2,0.7,1],0.5));//[0.2, 0.7]
log(getRange([0,0.2,0.7,1],0.1));//[0, 0.2]
log(getRange([0,0.2,0.7,1],0.2));//[0.2, 0.7]
//边缘案例
log(getRange([0,0.2,0.7,1],0));//[0, 0.2]
log(getRange([0,0.2,0.7,1],1));//[0.7, 1]
//范围外
log(getRange([0,0.2,0.7,0.8],0.9));//[0.7, 0.8]
log(getRange([0.2,0.3,0.7,0.8],0.1));//[0.2, 0.3]
//额外的
log(getRange([0.2,0.3,0.3,0.8,0.3]);//[0.3,0.3]

作为控制台包装{max height:100%!important;top:0;}
是数组中的
Y
Z
相邻值(就索引而言)?@NinaScholz因为我收集的
X
不一定存在于数组中。X不需要是数组中的值。但是Y和Z是相邻的值。为什么您的奖金案例是
[0.3,0.3]
而不是
[0.3,0.8]
您的问题是
Y嗯。。你的权利@Mark_M。我想当我决定这是一个我想避免的案例时,我的大脑停止了工作。用
Y啊,太好了!看起来棒极了。输入短于2个元素的优点。我很快就会想到的。我会暂缓一段时间,以防其他人正在研究答案。非常感谢。很好的解决方案!你让选择一个被接受的答案变得很困难。我确实认为user3297291的答案更简洁,但我喜欢这个答案如何解决奖金单元测试的问题。有些奇怪的是,范围有时包含底部值,有时不包含(参见示例)。尽管这对于我的用例来说不是一个问题。谢谢你,尼娜。
getRange([0, 0.2, 0.7, 1], 0.2));     // [0.2, 0.7]
[0, 0.2]