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

如何将指定对象数组转换为带动态键的预期对象数组?

按指定结构转换对象数组

给定输入数组

[
    {
      "tm_number": "9724084103",
      "tm_name": "PRADIP BHAI",
      "zsm_number": "9974252013",
      "zsm_name": "Jay Ambe1 Communicati",
      "zbm_number": "1234567890",
      "zbm_name": "ARIF MALEK",
      "ceo/sales_head/marketing_head_number": "9898049452",
      "zone_name": "Surat",
      "circle_name": "Gujarat",
      "category": "Challenger"
    },
    {
      "tm_number": "9724084103",
      "tm_name": "PRADIP duplicate",
      "zsm_number": "9974252013",
      "zsm_name": "Jay Ambe1 Communicati",
      "zbm_number": "1234567890",
      "zbm_name": "ARIF MALEK",
      "ceo/sales_head/marketing_head_number": "9898049452",
      "zone_name": "Surat",
      "circle_name": "Gujarat",
      "category": "Challenger"
    },
    {
      "tm_number": "9724084105",
      "tm_name": "PRADIP BHAI",
      "zsm_number": "9974252013",
      "zsm_name": "Jay Ambe Communicati",
      "zbm_number": "1234567890",
      "zbm_name": "ARIF MALEK",
      "ceo/sales_head/marketing_head_number": "9898049452",
      "zone_name": "Surat",
      "circle_name": "Gujarat",
      "category": "Challenger"
    },
    {
      "tm_number": "972484103",
      "tm_name": "SK BHAI",
      "zsm_number": "9974252013",
      "zsm_name": "Jay Ambe 2 Communicati",
      "zbm_number": "1234567890",
      "zbm_name": "ARIF MALEK",
      "ceo/sales_head/marketing_head_number": "9898049452",
      "zone_name": "Surat",
      "circle_name": "Gujarat",
      "category": "Challenger"
    },
    {
      "tm_number": "972484103",
      "tm_name": "SK BHAI",
      "zsm_number": "9974252013",
      "zsm_name": "Jay Ambe 3 Communicati",
      "zbm_number": "1234567890",
      "zbm_name": "ARIF MALEK",
      "ceo/sales_head/marketing_head_number": "9898049452",
      "zone_name": "Surat",
      "circle_name": "Gujarat",
      "category": "Challenger"
    }
]

预期输出结构

[
  {
    "9724084103": [
      {
        "tm_name": "PRADIP BHAI",
        "zsm_number": "9974252013",
        "zsm_name": "Jay Ambe1 Communicati",
        "zbm_number": "1234567890",
        "zbm_name": "ARIF MALEK",
        "ceo/sales_head/marketing_head_number": "9898049452",
        "zone_name": "Surat",
        "circle_name": "Gujarat",
        "category": "Challenger"
      },
      {
        "tm_name": "PRADIP duplicate",
        "zsm_number": "9974252013",
        "zsm_name": "Jay Ambe1 Communicati",
        "zbm_number": "1234567890",
        "zbm_name": "ARIF MALEK",
        "ceo/sales_head/marketing_head_number": "9898049452",
        "zone_name": "Surat",
        "circle_name": "Gujarat",
        "category": "Challenger"
      }
    ]
  },
  {
    "9724084105": [
      {
        "tm_number": "9724084105",
        "tm_name": "PRADIP BHAI",
        "zsm_number": "9974252013",
        "zsm_name": "Jay Ambe Communicati",
        "zbm_number": "1234567890",
        "zbm_name": "ARIF MALEK",
        "ceo/sales_head/marketing_head_number": "9898049452",
        "zone_name": "Surat",
        "circle_name": "Gujarat",
        "category": "Challenger"
      }
    ]
  },
  {
    "972484103": [
      {
        "tm_name": "SK BHAI",
        "zsm_number": "9974252013",
        "zsm_name": "Jay Ambe 2 Communicati",
        "zbm_number": "1234567890",
        "zbm_name": "ARIF MALEK",
        "ceo/sales_head/marketing_head_number": "9898049452",
        "zone_name": "Surat",
        "circle_name": "Gujarat",
        "category": "Challenger"
      },
      {
        "tm_name": "SK BHAI",
        "zsm_number": "9974252013",
        "zsm_name": "Jay Ambe 3 Communicati",
        "zbm_number": "1234567890",
        "zbm_name": "ARIF MALEK",
        "ceo/sales_head/marketing_head_number": "9898049452",
        "zone_name": "Surat",
        "circle_name": "Gujarat",
        "category": "Challenger"
      }
    ]
  }
]

注意事项

注意:键为动态值,需适配处理。

尝试的代码(未得到预期输出)

const data = [
{
    tm_number: "9724084103",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084103",
    tm_name: "PRADIP duplicate",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084105",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 2 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 3 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
];

function groupId(data) {
  let obj = {};
  const mydata = data.map((item) => {
    if (obj[item.tm_number]) {
      obj[item.tm_number].push(item);
    } else {
      obj[item.tm_number] = [item];
    }

    return obj;
  });

  console.log(mydata);
}

groupId(data);

高效实现方案

思路

  1. 用reduce遍历一次输入数组,按tm_number完成分组,时间复杂度O(n)。
  2. 将分组后的对象转换为预期数组结构,同时处理字段逻辑:
    • 分组内仅一个元素时,保留tm_number字段;
    • 分组内多个元素时,移除tm_number字段(外层键已对应该值)。

代码实现

function transformData(data) {
  // 1. 按tm_number分组
  const grouped = data.reduce((acc, item) => {
    const key = item.tm_number;
    acc[key] = acc[key] || [];
    acc[key].push(item);
    return acc;
  }, {});

  // 2. 转换为预期结构并处理字段
  return Object.entries(grouped).map(([key, items]) => ({
    [key]: items.map(item => {
      if (items.length === 1) {
        return { ...item };
      }
      const { tm_number, ...rest } = item;
      return rest;
    })
  }));
}

// 调用示例
const result = transformData(data);
console.log(JSON.stringify(result, null, 2));

说明

  • 仅需两次线性遍历,空间复杂度O(n),属于高效处理方案。
  • 通过计算属性名[key]实现动态键,适配任意tm_number值。

内容的提问来源于stack exchange,提问作者user11764411

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:45:34