在对象中规范化数字(范围0-1或0-100)的最佳方法是什么。
例如:
obj = {
"key1": 100,
"key2": 500,
"key3": 1000
}
期望的结果 -
obj = {
"key1": 0.1,
"key2": 0.5,
"key3": 1
}
我可以使用 -
规范化数组中的数字ratio = Math.max.apply(Math, numbers) / 100;
numbers = numbers.map(function (v) {
return Math.round(v / ratio);
});
但是如果这些数字属于一个目标,那么最佳的标准化方法是什么?
答案 0 :(得分:1)
这很容易做到 - 循环遍历你的对象并转换范围,这里是一些伪代码:
var applyToRange = function (num, source, destination) {
if (num < source[0] || num > source[1]) {
return NaN;
}
var oldMinValue = source[0];
var oldMaxValue = source[1];
var newMinValue = destination[0];
var newMaxValue = destination[1];
var a = (oldMaxValue - oldMinValue);
var b = (newMaxValue - newMinValue);
return ((num - oldMinValue) / a) * b + newMinValue;
}
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
// applyToRange();
}
}
您需要知道对象中的最小值和最大值才能使此特定方法有效。
答案 1 :(得分:0)
如果lodash(3.10是当前的)是一个选项,这可以用非常简洁的方式编写:
var obj = {
"key1": 100,
"key2": 500,
"key3": 1000
}
var max = Math.max.apply(Math, _.values(obj))
obj = _.mapValues(obj, function(val) {
return val / max;
})
答案 2 :(得分:0)
此脚本将此区间[100,1000]中的给定值移动到所需的[0,1]间隔。计算的基础是斜率m
和一些修正值。
var obj = {
"key1": 100,
"key2": 500,
"key3": 1000
},
range = [0, 1],
i,
min, max,
m,
values = [];
for (i in obj) {
values.push(obj[i]);
obj[i] = { value: obj[i] };
}
min = Math.min.apply(Math, values);
max = Math.max.apply(Math, values);
m = (range[1] - range[0]) / (max - min);
for (i in obj) {
obj[i].normalized = (obj[i].value - min) * m + range[0];
}
document.write('<pre>' + JSON.stringify(obj, null, 4) + '</pre>');
&#13;
答案 3 :(得分:-1)
怎么样?
obj = {
"key1": 100,
"key2": 500,
"key3": 1000
}
console.log(JSON.stringify(obj, null, 4));
for (var p in obj){
if (obj.hasOwnProperty(p)){
obj[p] /= 0.42;
}
}
console.log(JSON.stringify(obj, null, 4));
{ &#34; key1&#34;:100, &#34; key2&#34;:500, &#34; key3&#34;:1000} { &#34; key1&#34;:238.0952380952381, &#34; key2&#34;:1190.4761904761906, &#34; key3&#34;:2380.952380952381}