如何在对象数组中查找type值相同的对象并合并fields字段
实现方案
实现思路
不需要提前知道所有type的取值,只需要两次遍历数组即可完成需求:
- 第一次遍历先统计所有type对应的合并后fields,用Map存储,key为type值,value为该type下所有fields合并后的结果
- 第二次遍历原数组,给每个对象替换为对应type的合并后fields即可
完整代码
const arr = [ { type: 'type', fields: ['field1'] }, { type: 'type2' }, { type: 'type', fields: ['field2'] }, ] // 聚合同type的fields const typeFieldsMap = new Map() arr.forEach(item => { const currFields = item.fields || [] if (typeFieldsMap.has(item.type)) { // 此处用Set做fields去重,不需要去重可以去掉Set逻辑 const merged = [...new Set([...typeFieldsMap.get(item.type), ...currFields])] typeFieldsMap.set(item.type, merged) } else { typeFieldsMap.set(item.type, currFields) } }) // 生成最终数组 const res = arr.map(item => { const mergedFields = typeFieldsMap.get(item.type) return { ...item, // 仅当合并后fields不为空时保留fields字段,符合示例输出格式 ...(mergedFields.length ? { fields: mergedFields } : {}) } }) console.log(res) // 输出结果和你要求的完全一致
兼容说明
- 自动适配任意返回的type值,无需硬编码判断
- 兼容不存在fields字段的对象,不会强制新增空fields属性
- 自带fields去重能力,不需要去重可将合并逻辑改为
[...typeFieldsMap.get(item.type), ...currFields]
内容的提问来源于stack exchange,提问作者kkkkkkkkkkkkkkkkk
相关产品推荐
相关产品推荐

