Javascript 如何在某些范围内映射数字
我有一系列的值,例如,Javascript 如何在某些范围内映射数字,javascript,normalize,Javascript,Normalize,我有一系列的值,例如,[01100]=[minValue,maxValue]和频带数,例如频带数=5。 所以我可以得到这些波段: [0 - 20] [21 - 40] [41 - 60] [61 - 80] [81 - 100] 然后我想在每个范围内关联一个标度值: i: 0 --> [0 - 20] --> 0.2 i: 1 --> [21 - 40] --> 0.4 i: 2 --> [41 - 60] --> 0.6 i
[01100]=[minValue,maxValue]
和频带数,例如频带数=5
。
所以我可以得到这些波段:
[0 - 20]
[21 - 40]
[41 - 60]
[61 - 80]
[81 - 100]
然后我想在每个范围内关联一个标度值:
i: 0 --> [0 - 20] --> 0.2
i: 1 --> [21 - 40] --> 0.4
i: 2 --> [41 - 60] --> 0.6
i: 3 --> [61 - 80] --> 0.8
i: 4 --> [81 - 100] --> 1
该值通过以下方式计算:(i+1)/BANDS\u NUMBER
,其中i
是假设循环的索引
然后我有一个输入n
,它的值在[minValue,maxValue]=[01100]
范围内
我想要的是与这个数字相关的刻度值。
例如,如果:
n = 0 --> scaleValue = 0.2
n = 10 --> scaleValue = 0.2
n = 20 --> scaleValue = 0.2
n = 35 --> scaleValue = 0.4
n = 68 --> scaleValue = 0.8
n = 99 --> scaleValue = 1
...
如何创建这样的函数?我想象这样一个函数:
function map(n, minValue, maxValue, bandsNumber) {
const scaleValue = ...
return scaleValue
}
这里的所有值都是示例,我希望所有值都与任何其他值一起工作
我不知道该怎么做。我需要一些帮助…您可以使用本机的
数组.map
函数映射每个值
大概是这样的:
const vals=[
[0, 20],
[21, 40],
[41, 60],
[61, 80],
[81, 100],
];
常数带数=5;
const result=vals.map((范围、索引)=>(索引+1)/BANDS\u编号);
控制台日志(结果)代码>您可以采用一个公式,该公式采用范围和插槽,并返回一个标准化值
由于范围有点太长(最后一个值包含在间隔中),因此需要检查最后一个值,并防止获取所需间隔之外的下一个值
函数规格化(最小值、最大值、带数、n){
返回n==最大值
1.
:数学地板(1+((n-最小值)/(最大-最小值))*频带)/频带;
}
// 0.2 0.2 0.4 0.4 0.8 1 1
log(…[0,10,20,35,68,99100].map(normalize.bind(null,01000,5))代码>Nina Scholz的错了。对于值20
,她的normalize函数返回0.4
,而不是0.2
:
函数规格化(最小值、最大值、带数、n){
返回n==最大值
1.
:数学地板(1+((n-最小值)/(最大-最小值))*频带)/频带;
}
log(标准化(0,100,5,20));//预期为0.2,实际为0.4
第一组包含21项,而其他组包含19项,这正常吗?@KévinBibollet第一组包含21项,倒数第二组包含20项,而不是19项。@KévinBibollet Ye,如果集合不包含相同数量的元素,这不是问题。集合不包含相同数量的元素,这可能不是问题,但您必须指出如何分配范围。在您的示例中,您确定一个附加元素属于第一个集合。总是这样吗?如果有两个或更多的额外元素呢?谢谢,但我想要的是有点不同。我更喜欢你的函数变成那样函数规格化(minValue,maxValue,bandsNumber,n){…}