如何更简洁地构建可扩展的多层嵌套Hash Map对象?
更优的多层日期Hash Map实现方案
嘿,完全懂你这种一层一层手动嵌套赋值的痛苦——不仅写起来繁琐,后续维护或者加新日期的时候还容易出错。这里有几个更优雅、可扩展的方案,帮你搞定这个多层Hash Map的创建和更新:
1. 递归函数:动态适配任意层级的嵌套结构
这个方案的核心是写一个可复用的迭代函数,自动帮你创建不存在的层级,最后挂载日期数据。不管以后日期层级扩展到时分秒,都能轻松适配:
function buildNestedDateMap(baseObj, dateSegments, dayData) { let currentLevel = baseObj; for (let i = 0; i < dateSegments.length; i++) { const segment = dateSegments[i]; // 如果当前层级不存在该日期段,创建空对象 if (!currentLevel[segment]) { currentLevel[segment] = {}; } // 到最后一个日期段时,挂载数据 if (i === dateSegments.length - 1) { Object.assign(currentLevel[segment], dayData); } // 进入下一层级 currentLevel = currentLevel[segment]; } return baseObj; } // 使用示例 const dateMap = {}; // 初始化第一个日期数据 buildNestedDateMap(dateMap, ['2018', '02', '18'], { scheduledSlots: 0, totalSlots: 0, slots: null }); // 添加新日期数据 buildNestedDateMap(dateMap, ['2018', '03', '12'], { scheduledSlots: 0, totalSlots: 0, slots: null }); console.log(dateMap);
优点:完全自定义、可扩展,不需要依赖外部库,后续加新日期只需要调用函数传参数就行,代码复用性拉满。
2. ES2020+语法:可选链+逻辑空赋值
如果你的运行环境支持ES2020及以上(比如现代浏览器、Node.js 14+),可以用更简洁的语法来避免手动判断每一层是否存在:
const dateMap = {}; // 假设你的date数组格式是 [日, 月, 年],比如['18','02','2018'] const initialDate = ['18', '02', '2018']; // 逻辑空赋值(??=):只有当左侧为null/undefined时才创建空对象 dateMap[initialDate[2]] ??= {}; dateMap[initialDate[2]][initialDate[1]] ??= {}; dateMap[initialDate[2]][initialDate[1]][initialDate[0]] = { scheduledSlots: 0, totalSlots: 0, slots: null }; // 添加新日期同理 const newDate = ['12', '03', '2018']; dateMap[newDate[2]] ??= {}; dateMap[newDate[2]][newDate[1]] ??= {}; dateMap[newDate[2]][newDate[1]][newDate[0]] = { scheduledSlots: 0, totalSlots: 0, slots: null };
优点:不需要写额外函数,语法简洁直观,比原始写法更安全(不会意外覆盖已存在的层级对象)。
3. Lodash辅助:用_.set一键搞定
如果你的项目已经引入了Lodash库,那_.set方法就是为这种多层嵌套赋值场景量身打造的,一行代码就能完成层级创建和数据赋值:
const _ = require('lodash'); // 或ES模块:import _ from 'lodash' const dateMap = {}; // 设置初始日期数据 _.set(dateMap, ['2018', '02', '18'], { scheduledSlots: 0, totalSlots: 0, slots: null }); // 添加新日期数据 _.set(dateMap, ['2018', '03', '12'], { scheduledSlots: 0, totalSlots: 0, slots: null });
优点:代码最简洁,Lodash帮你处理了所有层级的判断和创建逻辑,几乎不需要自己写额外代码,适合已经用了Lodash的项目。
内容的提问来源于stack exchange,提问作者Shubham Bhardwaj
相关产品推荐
相关产品推荐

