如何将指定对象数组转换为带动态键的预期对象数组?
按指定结构转换对象数组
给定输入数组
[ { "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);
高效实现方案
思路
- 用
reduce遍历一次输入数组,按tm_number完成分组,时间复杂度O(n)。 - 将分组后的对象转换为预期数组结构,同时处理字段逻辑:
- 分组内仅一个元素时,保留
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
相关产品推荐
相关产品推荐

