如何解决JavaScript:查找浮点值所属的数组定义范围
我有一个用户生成的 JavaScript 对象,其格式如下:
a = {
"A": [1.20,1.75],"B": [1.80,2.25],"C": [2.35,3.15],"1": [3.40,3.95],"2": [3.97,4.15],"3": [4.30,5.15]
}
给定一个浮点数 x
,我想确定在同一数组中的哪两个值之间(如果有的话)x
。我还希望能够判断 x
是否在 all 数组中引用的值范围之外,或者它是否在两组值之间。也就是说,我想要一个函数 f(a,x)
使得:
-
f(a,4.01)
返回"2"
-
f(a,4.20)
返回["2","3"]
(因为4.20
在"2"
和"3"
中指定的范围之间) -
f(a,1.05)
返回"less"
(因为1.05
小于数组中提到的最小值,1.20
) -
f(a,5.20)
返回"greater"
(因为5.20
大于数组中引用的最大值5.15
)
我知道如何为一个特定对象硬编码(通过使用很长的一系列 if
和 else if
语句),我想我可以连接将所有数组合并为一个长数组,然后检查哪一对值 x
下降(或找到另一个非常乏味的解决方案)。
我的问题是:是否有一种简单的方法可以执行此任务?例如,库、内置函数等。
我使用的是服务器端 Node.js,所以如果你知道 NPM 上有一个可用的包,那就行了。
因为对象将是用户生成的,如果存在格式问题(例如重叠范围),如果您有办法抛出错误,则会加分。
P.S.不知道我解释清楚了没有。如果你不明白,请留下评论,以便我澄清。
解决方法
您可以从 Object.values
创建边界并定位给定值的边界。根据 lower
和 upper
边界,您可以检查 Object.entries
includes
是否。
const calc = (data,val) => {
const boundaries = Object.values(data).flat(1).sort((a,b) => a - b);
if (val < Math.min(...boundaries)) return "less"; // if < min
if (val > Math.max(...boundaries)) return "greater"; // if > max
const entries = Object.entries(data); // get object entries
// if value is a boundary
if (boundaries.includes(val))
return entries.map(([k,v]) => v.includes(val) ? k : null).filter(x => x);
const allLower = boundaries.filter((b) => val > b);
const lower = boundaries[allLower.length - 1]; // get lower
const upper = boundaries[boundaries.indexOf(lower) + 1]; // get upper
return entries.map(([k,v]) => {
return v.includes(lower) || v.includes(upper) ? k : null
}).filter(x => x);
}
const a = {
"A": [1.20,1.75],"B": [1.80,2.25],"C": [2.35,3.15],"1": [3.40,3.95],"2": [3.97,4.15],"3": [4.30,5.15]
}
console.log(calc(a,4.01)); // 2
console.log(calc(a,4.20)); // 2,3
console.log(calc(a,1.05)); // less
console.log(calc(a,5.20)); // greater
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。