我有一个对象列表,我想在已知的最小值和最大值之间缩放值。因此,如果已知的最小值和最大值为100、800,我希望结果如下:

{'cat' : 1, 'dog' : 3, 'chimp' : 8} -> {'cat' : 100, 'dog' : 300, 'chimp' : 800}


Python / pandas实现看起来像这样

def scale_size(old_value):
        if numbers_df['raw_size'].max() == 1:
            return 150
        old_value = float(old_value)
        old_max = numbers_df['raw_size'].max()
        old_min = numbers_df['raw_size'].min()
        new_max = 150
        new_min = 20
        old_range = old_max - old_min
        new_range = new_max - new_min
        new_value =  (((old_value - old_min) * new_range) / old_range) + new_min

        return int(new_value)

最佳答案

您应该创建一个函数来将值从一个范围映射到另一个范围。为此,您应该执行以下操作:


找出当前范围的最小值和最大值(例如(1,8)
找出要映射值的范围的最小值和最大值(例如(100,800)
通过计算旧范围内的相对位置并将该相对位置应用于新范围,将一个范围内的现有值映射到另一个范围


样例代码

我相信有更有效和/或更清洁的方法可以实现此目的,但这可能是您想要做的一个不错的起点。附带说明一下,理论上您可以通过找到键值对中的最小和最大值来计算当前范围的最小和最大值,但是这可能并不适合所有情况。



var oldVals = {'cat' : 1, 'dog' : 3, 'chimp' : 8};

function mapValues(oldMin, oldMax, newMin, newMax, values){
  var newVals = {};
  for (key in values){
    newVals[key] = (values[key] - oldMin) * (newMax - newMin) / (oldMax - oldMin) + newMin;
  }
  return newVals;
}

console.log(mapValues(1, 8, 100, 800, oldVals));

关于javascript - Javascript:遍历对象列表并在已知的最小值和最大值之间缩放值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44835010/

10-11 20:10