JS |通过嵌套的“ for of”循环递归

时间:2019-03-10 17:36:10

标签: javascript node.js recursion ecmascript-6

在学习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 个答案:

答案 0 :(得分:1)

一种简单的方法是使用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
      });
    }
  });
});

答案 1 :(得分:1)

首先,始终传递数组,方法通常不应在JavaScript中进行这种输入验证。另外,不要抛出calculateStatsForMetric,如果在那里有抛出代码,则将其包装在try / catch中,并返回一个falsey值。

现在,您可以使用高阶数组方法,例如flatMapmap

  • 获取每个指标
    • 对于每个指标
    • 获取每个统计信息(这要求在地图上显示flatMap)
    • 计算一个函数
    • 保留真实值(这需要过滤器)

或在代码中

export const refactored = (measure, metrics, stats) => 
  metrics.flatMap(metric => stats.map(stat => ({
    metric,
    stat,
    value: calculateStatsForMetric(stat, metric, measure)
  }))).filter(o => o.value);