You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Дмитрий Мищенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:45:33