JS如何按指定字段分组对象数组为分块列表且不修改reduce入参
你当前的实现是直接修改reduce的累加器对象,且最终得到的是按type为key的对象,还需要再转成你期望的数组结构。以下是不修改入参的实现方案:
方案1:无副作用的reduce实现
每次迭代都返回全新的累加器对象,完全不修改入参:
const groupedMap = data.reduce((acc, item) => { return { ...acc, [item.type]: [...(acc[item.type] || []), item] } }, {}) // 转换为你需要的数组输出格式 const res = Object.entries(groupedMap).map(([type, data]) => ({ type, data }))
方案2:普通遍历实现(逻辑更直观)
如果觉得reduce的写法不够好理解,可以用普通循环实现:
const groupMap = {} for (const item of data) { if (!groupMap[item.type]) { groupMap[item.type] = [] } // 若需要完全不影响原数据中的对象,可改为 push({...item}) 做浅拷贝 groupMap[item.type].push(item) } const res = Object.entries(groupMap).map(([type, data]) => ({ type, data }))
两种方案最终输出的res都完全符合你给出的预期格式,且不会修改reduce入参或者原数组数据。
内容的提问来源于stack exchange,提问作者lecham
相关产品推荐
相关产品推荐

