You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构JS代码将认知复杂度从16降低至SonarQube要求的15?

重构方案

原代码认知复杂度超标的核心原因是存在两段完全重复的「非空判断+循环遍历+内部条件匹配」逻辑,重复的嵌套分支拉高了整体复杂度。我们可以通过抽离公共逻辑、简化语法的方式降低复杂度,优化后代码如下:

(function () {
  // 抽离公共的分类匹配逻辑
  function getMatchedCategory(arr) {
    if (!arr) return null
    const matchedItem = arr.find(item => Utils.categoryMap[item.slug])
    return matchedItem ? Utils.categoryMap[matchedItem.slug] : null
  }

  window.dm = window.dm || { AjaxData: [] };
  window.dm.AjaxEvent = function (et, d, ssid, ad) {
    dm.AjaxData.push({
      et, d, ssid, ad,
    });
    window.DotMetricsObj && DotMetricsObj.onAjaxDataUpdate();
  };
  const d = document;
  const h = d.getElementsByTagName('head')[0];
  const s = d.createElement('script');
  let t = 'inews';
  s.type = 'text/javascript';
  s.async = true;

  // 优先匹配分类列表
  const categoryMatch = getMatchedCategory(window.PageContext.categories)
  if (categoryMatch) {
    t = categoryMatch
  } else {
    // 分类列表无匹配时倒序匹配面包屑
    const breadcrumbMatch = getMatchedCategory(window.PageContext.post?.breadcrumbs?.reverse())
    if (breadcrumbMatch) t = breadcrumbMatch
  }

}());

export default () => { };

核心优化点

  • 抽离重复逻辑:将两处完全相同的遍历匹配逻辑封装为独立函数,主流程中仅需两次函数调用即可完成赋值,大幅减少嵌套层级和重复判断带来的复杂度增量
  • 简化循环逻辑:用数组原生find方法替代手动for循环+break的写法,语法更简洁,同时减少了循环内部分支带来的复杂度累加
  • 简化非空判断:用可选链?.替代多层级的&&非空判断,进一步降低逻辑复杂度

修改后代码逻辑和原有功能完全一致,认知复杂度可降至15以下,满足SonarQube检测要求。

内容的提问来源于stack exchange,提问作者user1941537

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:48:04