JavaScript按city、boss多键分组实现嵌套对象数组
多层嵌套分组实现方案
你之前的代码仅完成了第一层城市维度的去重,遍历过程中反复覆盖boss字段,最终只能得到每个城市最后一条记录的boss值,没有实现第二层按负责人分组、归集咖啡店列表的逻辑。
实现两层嵌套分组逻辑很简单,按层级依次匹配、不存在对应分组就初始化结构、最后把当前数据归集到对应子列表即可,步骤如下:
- 遍历每条原始数据,先在结果列表中查找是否存在当前城市的分组,不存在就初始化城市分组(boss数组置空)加入结果
- 在找到的城市分组下,查找是否存在当前负责人(boss)的分组,不存在就初始化负责人分组(caffes数组置空)加入当前城市的boss列表
- 将当前咖啡店信息,追加到对应负责人分组的caffes数组中
可直接运行的代码
function groupCafeData(sourceData) { const result = []; for (const item of sourceData) { // 匹配城市分组 let currentCity = result.find(group => group.city === item.city); if (!currentCity) { currentCity = { city: item.city, boss: [] }; result.push(currentCity); } // 匹配城市下的负责人分组 let currentBoss = currentCity.boss.find(bossItem => bossItem.name === item.boss); if (!currentBoss) { currentBoss = { name: item.boss, caffes: [] }; currentCity.boss.push(currentBoss); } // 归集咖啡店数据 currentBoss.caffes.push({ name: item.name }); } return result; } // 测试用例 const arr = [ {city: 'New York', boss: 'John', name: 'Caffe 1'}, {city: 'New York', boss: 'John', name: 'Caffe 2'}, {city: 'New York', boss: 'Ben', name: 'Caffe 3'}, {city: 'New York', boss: 'Ben', name: 'Caffe 4'}, {city: 'Washington', boss: 'Lisa', name: 'Caffe 5'}, {city: 'Washington', boss: 'Lisa', name: 'Caffe 6'}, {city: 'Washington', boss: 'Kate', name: 'Caffe 7'}, {city: 'Washington', boss: 'Kate', name: 'Caffe 8'}, {city: 'Los Angeles', boss: 'Joe', name: 'Caffe 9'} ]; const result = groupCafeData(arr);
运行后result的结构和你给出的预期输出完全一致。
性能优化提示
如果处理的数据量超过万条,每次用find遍历查找分组的时间复杂度是O(n),性能偏低,可以替换成Map结构做索引,把查找复杂度降到O(1)。日常百条千条级别的数据,上面的写法可读性更好,直接用就行。
内容的提问来源于stack exchange,提问作者Дмитрий Мищенко
相关产品推荐
相关产品推荐

