【问题标题】:get range from the nearest number in javascript从javascript中最近的数字获取范围
【发布时间】:2021-07-23 09:00:59
【问题描述】:

我有一个范围对象,另一个是 price_values 数组,现在我想为 price_values 数组的每个值距范围对象最近的范围。我已经尝试了以下解决方案,但它没有给我正确的范围。

range = {
    0: '25-500',
    1: '1500-2500',
    2: '5000-10000'
}

let price_values = [5, 100, 1500, 7000, 15000]

我厌倦了以下解决方案

    let nearestPriceRangeArr = [];
let rangeLength = Object.keys(range).length;
Object.keys(range).forEach(key => {
    price_values.forEach((price, qKey) => {
        let rangeArr = key.split("-");
        let fromRange = parseInt(rangeArr[0]);
        let toRange = parseInt(rangeArr[1]);
        if(price <= fromRange) {
            if(x == 0) {
                nearestPriceRangeArr[price] = key;
            }
        } else {
            if (price >= fromRange && price <= toRange) {
                nearestPriceRangeArr[price] = key;
            } else {
                if(price >= toRange) {
                let ab = (x == rangeLength - 1) ? key : key;
                    nearestPriceRangeArr[price] = ab;
                }
            }
        }
        x++;
    });
});

预期输出

nearestPriceRangeArr[5] = '25-500';
nearestPriceRangeArr[100] = '25-500';
nearestPriceRangeArr[1500] = '1500-2500';
nearestPriceRangeArr[7000] = '5000-10000';
nearestPriceRangeArr[15000] = '5000-10000';

【问题讨论】:

  • 请添加想要的结果。
  • 您必须将范围存储为字符串吗?使用 min 和 max 数字存储对象无需任何字符串解析。
  • @NinaScholz 添加了预期输出
  • 3000、3750 或 4000 等值呢?
  • 它们将落入 5000-10000 范围内

标签: javascript typescript ecmascript-6 range


【解决方案1】:

您可以获取一个范围数组并通过检查价格找到范围。

const
    range = ['25-500', '1500-2500', '5000-10000'],
    prices = [5, 100, 1500, 7000, 15000],
    result = Object.fromEntries(prices.map(p => [p, range.find((r, i, { length }) => {
        const [low, high] = r.split('-').map(Number);
        return p <= high || i === length - 1;
    })]));

console.log(result);

【讨论】:

  • 我们能否为我在预期输出中提到的每个 price_values 设置一个键
【解决方案2】:

不知道我做了什么,但它为您的奇怪问题提供了奇怪的解决方案。

console.clear();
let range = {
    0: '25-500',
    1: '1500-2500',
    2: '5000-10000'
}
let price_values = [5, 100, 1500, 7000, 15000];
let nearestPriceRangeArr = {};
let rangeValues = Object.values(range);

price_values.forEach((price)=>{
  // for prices which are in one the range_values
  rangeValues.forEach((range, rangeIndex)=>{
    let ranges = range.split('-');
    if(price >= parseInt(ranges[0]) && price <= parseInt(ranges[1])){
      nearestPriceRangeArr = {
        ...nearestPriceRangeArr,
       [price] : range
      }
    }
    /* if price is not falling in any range */
    // if price is smaller than first range
    if(rangeIndex === 0){
        if(price <= ranges[0]){
          nearestPriceRangeArr = {
          ...nearestPriceRangeArr,
         [price] : range
        }
      }
    } else {
      // if price is greater than previous range
      // and smaller than current range
      const previousRanges = rangeValues[rangeIndex - 1].split("-");
      if(price > previousRanges[1] && price <= ranges[0] ){
         nearestPriceRangeArr = {
          ...nearestPriceRangeArr,
         [price] : range
        }
      } else {
        // if price is greater than last range
        if(price > ranges[1]){
            nearestPriceRangeArr = {
            ...nearestPriceRangeArr,
           [price] : range
          }
        }
      }
    }
  })  
})

console.log(nearestPriceRangeArr);
console.log(nearestPriceRangeArr[5])
console.log(nearestPriceRangeArr[100])
console.log(nearestPriceRangeArr[1500])
console.log(nearestPriceRangeArr[7000])
console.log(nearestPriceRangeArr[15000])

【讨论】:

    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多