微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript:查找浮点值所属的数组定义范围

如何解决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

我知道如何为一个特定对象硬编码(通过使用很长的一系列 ifelse if 语句),我想我可以连接将所有数组合并为一个长数组,然后检查哪一对值 x 下降(或找到另一个非常乏味的解决方案)。

我的问题是:是否有一种简单的方法可以执行此任务?例如,库、内置函数等。

我使用的是服务器端 Node.js,所以如果你知道 NPM 上有一个可用的包,那就行了。

因为对象将是用户生成的,如果存在格式问题(例如重叠范围),如果您有办法抛出错误,则会加分。


P.S.不知道我解释清楚了没有。如果你不明白,请留下评论,以便我澄清。

解决方法

您可以从 Object.values 创建边界并定位给定值的边界。根据 lowerupper 边界,您可以检查 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 举报,一经查实,本站将立刻删除。