使用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 }, {}); }
优化说明
[item.Open, item.Close].filter(Boolean)会过滤掉Open或Close为空的无效值,避免无意义的判断- 用
Set对状态值去重,当同一条数据的Open和Close值相同时,只会执行一次初始化逻辑,完全消除重复校验 - 所有初始化逻辑都收拢到同一处,后续如果需要调整初始化规则,只需要修改一处即可,维护性更高
内容的提问来源于stack exchange,提问作者I'll-Be-Back
相关产品推荐
相关产品推荐

