Javascript |Мин и Макс метод к одному сухому методу - PullRequest
2 голосов
/ 10 марта 2019

У меня есть функция min a max, которая просто идентична, за исключением того, что используется Math.min, а последняя использует Math.max

// calculate min value
function getMinMetric(measurements, metric) {
  let value = null
  measurements.forEach(measurement => {
    if (measurement[metric]) {
      !value ? (value = measurement[metric]) : (value = Math.min(value, measurement[metric]))
    }
  })
  return value
}

// calculate max value
function getMaxMetric(measurements, metric) {
  let value = null
  measurements.forEach(measurement => {
    if (measurement[metric]) {
      !value ? (value = measurement[metric]) : (value = Math.max(value, measurement[metric]))
    }
  })
  return value
}


Любая функция будет возвращена в зависимости от условий, таких как:

function calculateStatsForMetric(stat, metric, measurements) {
  if (stat === 'min') return getMinMetric(measurements, metric)
  if (stat === 'max') return getMaxMetric(measurements, metric)
  *****
}

Как я мог бы объединить функции min и max в один метод для СУХОГО подхода, поэтому я не получаю избыточность?

Далее: Это хорошая практика - или на самом деле, я должен стремиться к тому, чтобы отдельные функции возвращали отдельные значения (как сейчас), чтобы они могли быть независимыми и иметь разделение интересов?

Ответы [ 3 ]

2 голосов
/ 10 марта 2019

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

function getMetric(measurements, metric, whichFn) {
  let value = null
  measurements.forEach(measurement => {
    const currentValue = measurement[metric]
    if (currentValue) {
      value = value ? whichFn(value, currentValue) : currentValue
    }
  })
  return value
}

Таким образом, вы можете назвать это как:

getMetric(..., ..., Math.min)
2 голосов
/ 10 марта 2019

В вашей функции может быть параметр type, который будет "min" или "max".И тогда вы можете вызвать функцию Math[type], используя Bracket Notation .А также я обновил троичный оператор.

function getMetric(type,measurements, metric) {
  let value = null
  measurements.forEach(measurement => {
    if (measurement[metric]) {
      value = !value ? measurement[metric]) : Math[type](value, measurement[metric])
    }
  })
  return value
}

Так вы будете вызывать функцию

getMetric('min',..., ...) //for min
getMetric('max',..., ...) //for max
1 голос
/ 10 марта 2019

Я использовал map и filter.

function calculateStatsForMetric(stat, metric, measurements) {
  const arr = measurements.map(m => m[metric]).filter(v => !!v);
  Math[stat].apply(null, arr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...