Вместо forEach, как я могу использовать .map (), .reduce () и .filter (), чтобы сделать мой код лаконичным, чтобы не стать хрупким? - PullRequest
0 голосов
/ 17 марта 2019

Я беру массив объектов (пусть необработанных), получаю значение с помощью displayName и вставляю его в (const defaultCirclePackStructure) с помощью displayName, это для упаковки круга d3.Вот Codepen

let convertMetricDataToD3 = (arrayMetricData) => {
  var circlePackData = defaultCirclePackStructure
  let operationSumTime = 0

  arrayMetricData.forEach(element => {
    insertMetricData(element, circlePackData)
    if(element.displayName === "Equipment Uptime" || element.displayName === "Equipment  Downtime"){
      operationSumTime+=element.value
    }
  });

  circlePackData.children[0].children[1].value = 
Math.round(operationSumTime) + "%"
  return circlePackData;
}

Это работает, но оно настолько хрупкое и неэффективное, как я могу улучшить его, используя карту, уменьшить, отфильтровать или что-то еще.

1 Ответ

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

Сойдя с твоего пера, я смог создать следующее, более удобное в обслуживании.

const convertMetricDataToD3 = (arrayMetricData) => {

  const circlePackData = defaultCirclePackStructure;
  arrayMetricData.forEach(element => insertMetricData(element, circlePackData));

  const trackedOperations = [
    'Equipment Uptime',
    'Equipment Downtime',
  ];

  const operationSumTime = arrayMetricData
    .filter(({displayName}) => trackedOperations.includes(displayName))
    .map(({value})=> value)
    .reduce((a, b) => a + b);

  circlePackData.children[0].children[1].value = Math.round(operationSumTime) + "%";

  return circlePackData;
}
...