如何将对象数组转为嵌套对象?使用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);
代码说明
- 初始化一个空对象
acc作为累加器 - 遍历数组中的每个元素:
- 检查累加器中是否存在当前元素的
sno键,不存在则创建空对象 - 将当前元素赋值给
acc[item.sno][item.id],实现以sno分组、id为内层键的结构
- 检查累加器中是否存在当前元素的
- 最后返回累加器,得到目标嵌套对象
这个方法轻量高效,不会引入外部库的额外开销,避免了Lodash导致的崩溃问题,同时完全满足需求。
内容的提问来源于stack exchange,提问作者CrRpTDEV
相关产品推荐
相关产品推荐

