首页 > 解决方案 > 如何在两个数字之间的范围内动态创建不同的步长

问题描述

我需要在具有不同给定步骤的两个数字之间创建一个动态范围,例如raneg1 范围在-9.00to之间+4.00,它包含 3 个不同的步骤

-9.00 -> -6.50 = step is 0.50
-6.00 -> 0.00 = step is 0.25
+0.25 -> +4.00 = step is is0.50

如您所见,数据存储在raneg1 字符串中,-09.00_-6.50_0.50beginingof subrange_end of subrange_step

var rane1 = " -09.00_-6.50_0.50,-6.00_0.00_0.25,+0.25_+4.00_0.50";
var rane2 = " -04.00_-9.25_0.25,-09.00_-6.50_0.50,-6.00_0.00_0.25,+0.25_+8.00_0.50";

var ranearr1 = rane1.split(/\,\s*/).reduce(function(arr, item) {
  if (item.length) {
    arr.push(item.split('_'));
  }
  return arr;
}, []);

var ranearr2 = rane2.split(/\,\s*/).reduce(function(arr, item) {
  if (item.length) {
    arr.push(item.split('_'));
  }
  return arr;
}, []);

var list = [];
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

标签: javascriptjquery

解决方案


不确定步骤部分。

第一种方法找到范围内有多少独特的步骤。

第二种方法将检查范围字符串中每个范围所需的步数,并且只计算唯一的步数。

var rane1 = " -09.00_-6.50_0.50,-6.00_0.00_0.25,+0.25_+4.00_0.50";
var rane2 = " -04.00_-9.25_0.25,-09.00_-6.50_0.50,-6.00_0.00_0.25,+0.25_+8.00_0.50";

const dynamicRange = (ranges) => {
  //set to count different step
  const counter = new Set();
  //reduce to count min max value for each range
  const minMax = ranges.split(/\,\s*/).reduce((res, range) => {
    const [start, end, step] = range.split('_');
    counter.add(step)
    return [
      res[0]&&parseFloat(res[0])<parseFloat(start) ? res[0] : start,
      res[1]&&parseFloat(res[1])>parseFloat(end) ? res[1] : end,
    ]
  
  }, [])
  //return [start, end, different step]
  return [...minMax, counter.size]
}


//count different steps need for each range
const dynamicRangeDiffSteps = (ranges) => {
  //set to count unique number of steps needs for each range
  const counter = new Set();
  //reduce to count min max value for each range
  const minMax = ranges.split(/\,\s*/).reduce((res, range) => {
    const [start, end, step] = range.split('_');
    //convert start, end step to float
    const sFloat = parseFloat(start), eFloat = parseFloat(end), stepFloat = parseFloat(step)
    //add number of steps needed to set
    counter.add((eFloat-sFloat)/stepFloat)
    return [
      res[0]&&parseFloat(res[0])<sFloat ? res[0] : start,
      res[1]&&parseFloat(res[1])>eFloat ? res[1] : end,
    ]
  
  }, [])
  //return [start, end, different step]
  return [...minMax, counter.size]
}

console.log(dynamicRange(rane1))
console.log(dynamicRange(rane2))

console.log(dynamicRangeDiffSteps(rane1))
console.log(dynamicRangeDiffSteps(rane2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


推荐阅读