Javascript: перебирать список объектов и масштабировать значения между известными минимальными и максимальными значениями.

1

У меня есть список объектов, и я хочу масштабировать значения между известными min и max. Поэтому, если известны min и max 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)
Теги:
scale

2 ответа

1
Лучший ответ

Вы должны создать функцию для сопоставления значений из одного диапазона в другой. Для этого вы должны сделать следующее:

  • Выясните минимальные и максимальные значения текущего диапазона (например, (1,8))
  • (100,800) минимальный и максимальный диапазон, в который вы хотите сопоставить значения (например, (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));
1

Вы можете рассчитать коэффициент, используя дельта max минус минус требуемого и заданных диапазонов и вычислить новое значение для каждого значения объекта.

var object = { cat: 1, dog: 3, chimp: 8 },
    min = 100,
    max = 800,
    minO = Math.min(...Object.values(object)),
    maxO = Math.max(...Object.values(object)),
    factor = (max - min) / (maxO - minO);

Object.keys(object).forEach(k => object[k] = (object[k] - minO) * factor + min);

console.log(object);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню