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

如何将对象数组转为嵌套对象?使用Lodash时Web应用崩溃

问题:将对象数组转换为嵌套结构(以sno为顶层键、id为内层键)

需要把对象数组转换成以sno为顶层键、id为内层键的嵌套对象。曾用Lodash实现,但导致Web应用崩溃;自行尝试其他方法未得到预期输出,在构建嵌套对象时遇到困难。

原始数据

let apiResponse = [{
                   id: 134,
                   user_name: 'abc',
                   phone_number: 1234567890,
                   sno: 'AM'
                },
                {
                  id: 948,
                  user_name: 'def',
                  phone_number: 9823437483,
                  sno: 'AM'
                }, 
                { 
                  id: 865,
                  user_name: 'abc',
                  phone_number: 1234567890,
                  sno: 'PM'                
                },
                {
                  id: 659,
                  user_name: 'ghi',
                  phone_number: 9834763467,
                  sno:'PM'
                },
                {
                  id: 456,
                  user_name: 'ghi',
                  phone_number: 9834763467,
                  sno:'AM'
                },
                {
                  id: 659,
                  user_name: 'ghi',
                  phone_number: 9834763467,
                  sno:'PM'
                }]

预期输出

{
    "AM": {
            "134": {
                   id: 134,
                   user_name: 'abc',
                   phone_number: 1234567890,
                   sno: 'AM'
                 },
             "948":{
                  id: 948,
                  user_name: 'def',
                  phone_number: 9823437483,
                  sno: 'AM'
                 },
             "456":{
                  id: 456,
                  user_name: 'ghi',
                  phone_number: 9834763467,
                  sno:'AM'
                 }
            },
      "PM":{
            "865": {
                   id: 865,
                   user_name: 'abc',
                   phone_number: 1234567890,
                   sno: 'PM'
                 },
             "659":{
                  id: 659,
                  user_name: 'ghi',
                  phone_number: 9834763467,
                  sno:'PM'
                 }
           }
         }

注:预期输出中的"687"条目在原始数据中不存在,推测为笔误,实际处理以原始数据为准

解决方案(原生JavaScript实现)

用Array.reduce方法遍历数组,逐步构建嵌套对象,无需依赖外部库:

const result = apiResponse.reduce((acc, item) => {
  // 如果当前sno对应的顶层对象不存在,先创建空对象
  if (!acc[item.sno]) {
    acc[item.sno] = {};
  }
  // 将当前元素以id为键存入对应的sno对象中,重复id会覆盖之前的条目
  acc[item.sno][item.id] = item;
  return acc;
}, {});

console.log(result);

代码说明

  1. 初始化一个空对象acc作为累加器
  2. 遍历数组中的每个元素:
    • 检查累加器中是否存在当前元素的sno键,不存在则创建空对象
    • 将当前元素赋值给acc[item.sno][item.id],实现以sno分组、id为内层键的结构
  3. 最后返回累加器,得到目标嵌套对象

这个方法轻量高效,不会引入外部库的额外开销,避免了Lodash导致的崩溃问题,同时完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:13:23