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

使用reduce按Open/Close状态分组时如何消除重复的初始化校验逻辑

代码优化方案

核心思路

  • 收集每条数据的Open、Close状态值后做去重、空值过滤处理,统一遍历执行初始化,彻底解决相同状态重复校验的问题
  • 抽离重复的初始化逻辑,简化代码结构,执行结果和原逻辑完全一致

优化后代码(ES2021+ 语法)

const items = [
  { Id: 100, Open: 'Status_111', Close: 'Status_111' },
  { Id: 200, Open: 'Status_111', Close: 'Status_222' },
  { Id: 300, Open: 'Status_333', Close: 'Status_444' }
]

function groupByOpenAndClose(items) {
  return items.reduce(function (obj, item) {
    // 收集状态、过滤空值、去重后统一初始化
    [...new Set([item.Open, item.Close].filter(Boolean))].forEach(status => {
      obj[status] ||= { Open: [], Close: [] }
    })
    
    item.Open && obj[item.Open].Open.push(item.Id)
    item.Close && obj[item.Close].Close.push(item.Id)

    return obj
  }, {});
}

console.log(groupByOpenAndClose(items));

兼容低版本JS的写法

如果运行环境不支持ES2021的||=运算符,可以替换为传统if判断,优化效果一致:

function groupByOpenAndClose(items) {
  return items.reduce(function (obj, item) {
    [...new Set([item.Open, item.Close].filter(Boolean))].forEach(status => {
      if (!obj[status]) {
        obj[status] = { Open: [], Close: [] }
      }
    })
    
    if (item.Open) obj[item.Open].Open.push(item.Id)
    if (item.Close) obj[item.Close].Close.push(item.Id)

    return obj
  }, {});
}

优化说明

  1. [item.Open, item.Close].filter(Boolean)会过滤掉Open或Close为空的无效值,避免无意义的判断
  2. 用Set对状态值去重,当同一条数据的Open和Close值相同时,只会执行一次初始化逻辑,完全消除重复校验
  3. 所有初始化逻辑都收拢到同一处,后续如果需要调整初始化规则,只需要修改一处即可,维护性更高

内容的提问来源于stack exchange,提问作者I'll-Be-Back

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:36:03