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

RxJS中按合规状态汇总资源计数:是否有更简洁实现方式?

优化RxJS合规状态资源计数汇总的写法

你的代码逻辑可行,但可以通过减少冗余请求、扁平化管道结构让代码更简洁易读,以下是两种优化方案:

方案一:针对原模拟场景(无参数的计数请求)

原代码中每个合规类型都重复请求了所有规则的计数,这里先一次性计算所有规则的总计数,再复用该值生成最终结果:

const { combineLatest, of, map, switchMap } = require('rxjs');

const rules$ = of(['one', 'two', 'three']); // 实际来自HTTP请求
const complianceTypes = [
  'COMPLIANT',
  'NON_COMPLIANT',
  'NOT_APPLICABLE',
  'INSUFFICIENT_DATA',
];

const getCountsForRule$ = () => of(1); // 实际来自HTTP请求

rules$
  .pipe(
    // 一次性获取所有规则的计数并求和
    switchMap(rules => combineLatest(rules.map(getCountsForRule$)).pipe(
      map(totalPerRule => totalPerRule.reduce((sum, count) => sum + count, 0))
    )),
    // 基于总计数快速生成每个合规类型的统计对象
    map(totalCount => complianceTypes.reduce(
      (acc, type) => ({ ...acc, [type]: totalCount }),
      {}
    ))
  )
  .subscribe(res => console.log('Got result', { res }));

方案二:针对实际场景(计数请求需传入规则和合规类型)

如果getCountsForRule$实际需要接收rule和complianceType参数,可通过简化对象合并逻辑优化:

const { combineLatest, of, map, switchMap } = require('rxjs');

const rules$ = of(['one', 'two', 'three']);
const complianceTypes = [
  'COMPLIANT',
  'NON_COMPLIANT',
  'NOT_APPLICABLE',
  'INSUFFICIENT_DATA',
];

// 实际场景中接收规则和合规类型参数
const getCountsForRule$ = (rule, complianceType) => of(1);

rules$
  .pipe(
    switchMap(rules => combineLatest(
      complianceTypes.map(type => 
        combineLatest(rules.map(rule => getCountsForRule$(rule, type))).pipe(
          map(counts => ({ [type]: counts.reduce((sum, c) => sum + c, 0) }))
        )
      )
    )),
    // 用Object.assign代替reduce合并结果对象,更简洁
    map(results => Object.assign({}, ...results))
  )
  .subscribe(res => console.log('Got result', { res }));

核心优化点

  • 减少冗余请求:方案一避免了对同一规则计数的重复请求,降低实际HTTP场景下的资源消耗
  • 扁平化管道:简化嵌套的combineLatest结构,让逻辑更线性,可读性更强
  • 简化对象合并:用Object.assign或展开语法替代多层reduce,减少代码复杂度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:07:05