规范化对象中的数字

时间:2015-07-02 17:13:38

标签: javascript object numbers normalize

在对象中规范化数字(范围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);
});

但是如果这些数字属于一个目标,那么最佳的标准化方法是什么?

4 个答案:

答案 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和一些修正值。

&#13;
&#13;
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;
&#13;
&#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}