首页 > 解决方案 > 如何将 JavaScript 中函数的认知复杂度从 10 降低到 6

问题描述

我在降低此函数的认知复杂性时遇到了麻烦。我尝试将其中的内容分离forEach为另一个函数并在getCars函数中调用它,但失败了。有人可以帮忙吗?

const getCars = (cars, config, types) => {
  const {
    carName
  } = types;
  const carObject = {};
  const carsRange = () => {}
  let carRange = carsRange(cars);
  Object.entries(cars).forEach(([key, value]) => {
    if (key === 'sedan' && value) {
      const carRangeVal = value.split(' ');
      const year = carRangeVal[1];
      const model = carRangeVal[0].substring(1, 2);
      carRange = generateCarRange(year, model);
    }
    if (key === 'suv' && value) {
      const carRangeVal = value.split(' ');
      const year = carRangeVal[1];
      const model = carRangeVal[0];
      carObject['model'] = true;
      carRange = checkYear(year, model);
    }
    if (value) {
      carObject[key] = value;
    }
  });

  if (
    config.header === 'TEST A' ||
    config.header === 'TEST B'
  ) {
    carObject['carName'] = carName[0].id;
  }

  carObject['configName'] = config.header;
  carObject['contractStartDate'] = carsRange[0];
  carObject['contractEndDate'] = carsRange[1];
  return carObject;
};

console.log(getCars({}, {}, {}));

标签: javascriptecmascript-6

解决方案


您可以缩短 .forEach 函数中的代码:

[year,model] = value.split(' '); // destructuring assignment
if (key === 'sedan' && value) {
  model = model.substring(1, 2);
  carRange = generateCarRange(year, model);
}
if (key === 'suv' && value) {
  carObject['model'] = true;
  carRange = checkYear(year, model);
}

了解输入数据会很有帮助。

我有一个暗示,你最好使用.map()而不是.forEach().

为什么你有两个函数(generateCarRange()checkYear())要得到carRange

(我发现使用匈牙利表示法总是知道我的变量的类型很有帮助。)


推荐阅读