如何匹配Item的rooms数组与Room对象ID并为Room添加关联count计数
Room对象关联频次统计与加工实现方案
处理思路
全程采用线性遍历的处理方式,既保证Item类型对象的原始结构完全不被修改,也避免多层嵌套循环带来的性能损耗:
- 第一次遍历全量数组,只提取Item类型对象的rooms数组内的所有Room id,生成一个id到出现次数的映射字典
- 第二次遍历全量数组做差异化加工:遇到Item对象就直接原样返回;遇到Room对象就从之前生成的字典里取对应id的计数值,新增
count字段存这个值,没有匹配到关联的Room默认count为0
可直接复用的实现代码
// 替换为API实际返回的原始数组即可 const rawData = [ { rooms: [ 'f03e6e40-870d-11eb-88a2-0149a30c02c5' ], itemType: 'Item', id: '8c6a6070-80c0-11eb-9753-bb149505e85f', itemName: 'Item 1', }, { rooms: [ 'eef60fc0-870d-11eb-88a2-0149a30c02c5' ], itemType: 'Item', id: '3aede320-870f-11eb-9e58-9d6fb0d8b5a8', itemName: 'Item 2' }, { rooms: [ 'f03e6e40-870d-11eb-88a2-0149a30c02c5' ], itemType: 'Item', id: '3ad52b00-870f-11eb-8f84-0782ebd81006', itemName: 'Item3' }, { itemType: 'Room', id: 'f03e6e40-870d-11eb-88a2-0149a30c02c5', itemName: 'Bedroom' }, { itemType: 'Room', id: 'eef60fc0-870d-11eb-88a2-0149a30c02c5', itemName: 'Bedroom 2' }, ] // 生成Room id的出现次数映射 const roomCountMap = {} rawData.forEach(entry => { // 仅对Item类型对象做频次统计 if (entry.itemType === 'Item') { entry.rooms.forEach(roomId => { // 对应id计数累加,初始不存在则设为1 roomCountMap[roomId] = (roomCountMap[roomId] || 0) + 1 }) } }) // 生成最终加工后的数组 const processedData = rawData.map(entry => { if (entry.itemType === 'Room') { // 为Room对象补充count字段 return { ...entry, count: roomCountMap[entry.id] || 0 } } // Item类型对象保持原结构直接返回 return entry })
边界场景提示
如果业务逻辑要求按「关联的Item数量」计数,而非按Room id的出现次数计数,只需要在统计阶段对每个Item的rooms数组做一层去重,避免同一个Item内重复引用同一个Room id导致的重复计数即可。
内容的提问来源于stack exchange,提问作者Pratap Penmetsa
相关产品推荐
相关产品推荐

