【问题标题】:Get matched range value from array javascript从数组javascript获取匹配的范围值
【发布时间】:2021-12-03 21:20:11
【问题描述】:

我有一个名为范围的数组和一个查找变量。现在我试图从我的范围数组中获取匹配的范围值。我试图减少方法,但它给了我一个意想不到的输出。

实际输出

  • 我的值是 51,然后返回 100

预期输出

  • Ex 1 - 我的值是 51 它在 0-100 之间它应该返回 0 Ex 2 - My 值是 135 它在 100-150 之间它应该返回 100

我的代码

var lookup = 51; 
var range = [0, 100, 150, 200, 300, 300.2];
let filtered = range.reduce((prev, curr) => Math.abs(curr - lookup) < Math.abs(prev - lookup) ? curr : prev);
console.log(filtered); //100

在这种情况下不起作用

const lookup = 201; 
const range = [200, 250, 300, 0, 450, 898].reverse();
const result = range.find(num => num <= lookup);
console.log(result); //0

【问题讨论】:

  • 您需要明确您的范围是如何定义的。它们是从一个索引到下一个索引吗?所以0...450 如果是这样,那么200...250 包含在该范围内。如果是这种情况,那么您想要它匹配的第一个范围还是最小范围?投票结束,直到您明确为止。

标签: javascript arrays typescript


【解决方案1】:

您想要的结果是范围数组中的单个数字,因此您应该使用.find 而不是.reduce。从右边开始迭代,对于第一个被迭代小于或等于查找的元素返回 true。

const lookup = 51; 
const range = [0, 100, 150, 200, 300, 300.2].reverse();
const result = range.find(num => num <= lookup);
console.log(result);

如果数组不一定要先排序,则对其进行排序。

const lookup = 201; 
const range = [200, 250, 300, 0, 450, 898].sort((a, b) => b - a);
const result = range.find(num => num <= lookup);
console.log(result);

【讨论】:

  • 它对我有用,但你能解释一下为什么我们需要使用 reverse 吗?
  • @Amv 因为,要找到第一个低于查找的数字,您需要从右侧开始查找,而不是从左侧开始。
  • @CertainPerformance 您的解决方案无法正常工作。我在我的问题中添加了案例
  • 它依赖于被排序的数组(我的回答也是如此)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多