JS |Рекурсировать через вложенную "для" петли - PullRequest
0 голосов
/ 10 марта 2019

Во время изучения NodeJS я пытался написать более краткую логику для этого блока кода (см. Ниже), которая могла бы либо ввести рекурсию , либо использовать методы ES6 дляобеспечить больше элегантности и лучшей читаемости.

Меня беспокоит вложение, которое происходит на for of loops

Мысли?

export function pleaseRefactorMe(measures, metrics, stats) {

  if (!Array.isArray(metrics)) metrics = [metrics] //=> returns array [ 'temperature' ]
  if (!Array.isArray(stats)) stats = [stats] //> returns array [ 'min', 'max', 'average' ]


  let statistics = []

/**** refactor opportunity for nested for of loops ****/
  for (let metric of metrics) {
    for (let stat of stats) {
      try {
        let value = calculateStatsForMetric(stat, metric, measure)

        if (value) {
          statistics.push({
            metric: metric,
            stat: stat,
            value: value
          })
        }
      } catch (err) {
        return err
      }
    }
  }

  return statistics
}

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Во-первых, всегда передавайте массивы, методы обычно не должны выполнять такую ​​проверку ввода в JavaScript.Также не добавляйте calculateStatsForMetric, если у вас есть бросающий код, оберните его в try / catch и верните значение Falsey.

Теперь вы можете использовать методы массива более высокого порядка, такие как flatMap и map:

  • Взять каждую метрику
    • Для каждой метрики
    • Взять каждую статистику (это требуетflatMap на карте)
    • Рассчитать на нем функцию
    • Сохранить истинные значения (для этого требуется фильтр)

Или в коде:

export const refactored = (measure, metrics, stats) => 
  metrics.flatMap(metric => stats.map(stat => ({
    metric,
    stat,
    value: calculateStatsForMetric(stat, metric, measure)
  }))).filter(o => o.value);
1 голос
/ 10 марта 2019

Простой подход заключается в использовании forEach -

let statistics = [];
metrics.forEach(m => {
  stats.forEach(s => {
    let value = calculateStatsForMetric(s, m, measures);
    if (value) {
      statistics.push({
        metric: m,
        stat: s,
        value: value
      });
    }
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...