【问题标题】:JavaScript: Finding the array-defined range into which a float value fallsJavaScript:查找浮点值所属的数组定义范围
【发布时间】:2021-06-21 01:06:37
【问题描述】:

我有一个用户生成的 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

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

我的问题是:有没有简单的方法来执行这个任务?例如,一个库,内置函数等

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

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


附注我不知道我是否清楚地解释了这一点。如果您不明白,请发表评论,以便我澄清。

【问题讨论】:

  • 如果您知道如何为一个值执行此操作,只需循环该代码即可。
  • 当对象为{A: [1,2], B: [4,5]},值为3时,你想返回什么?它既不小于也不大于所有范围。
  • @Bergi 它在AB 之间,所以它应该返回["A", "B"]。我的意思是我知道如何将它硬编码为一个 pre-determineda 的函数。如果a 的值发生变化,则必须重写该函数。

标签: javascript arrays javascript-objects


【解决方案1】:

您可以从Object.values 创建边界并定位给定值的边界。根据lowerupper的边界,你可以检查Object.entriesincludes是否。

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

【讨论】:

  • 有人知道有这个功能的库吗?
  • @BenZ。我没有,但我认为你可以用 lodash 完成类似的事情
  • 你知道 Lodash 的哪个函数会是类似的吗?
  • @BenZ。我没有用它来告诉你,但你可以在文档中查看它lodash.com/docs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
相关资源
最近更新 更多