如何实现支持路径自动创建的JSON对象setPath赋值函数?
实现setPath函数:动态设置JSON对象的嵌套路径值
完整实现代码
function setPath(payload, path, value) { // 深拷贝原始对象,避免修改原数据 const result = JSON.parse(JSON.stringify(payload)); // 解析路径,提取节点和数组下标 const pathSegments = []; const regex = /([^\.\[\]]+)(?:\[(\d+)\])?/g; let match; while ((match = regex.exec(path)) !== null) { const key = match[1]; const index = match[2]; pathSegments.push(key); if (index !== undefined) { pathSegments.push(Number(index)); } } let current = result; // 遍历路径片段,创建嵌套结构 for (let i = 0; i < pathSegments.length - 1; i++) { const segment = pathSegments[i]; const nextSegment = pathSegments[i + 1]; // 如果当前节点不存在,根据下一个节点类型初始化 if (!(segment in current)) { current[segment] = typeof nextSegment === 'number' ? [] : {}; } current = current[segment]; // 处理当前节点是数组但下标超出长度的情况 if (Array.isArray(current) && typeof nextSegment === 'number' && current.length <= nextSegment) { while (current.length <= nextSegment) { current.push(undefined); } } } // 设置最终值 const lastSegment = pathSegments[pathSegments.length - 1]; current[lastSegment] = value; return result; }
代码说明
- 路径解析:用正则表达式拆分路径字符串,把
"foo.bar[0]"这类格式转换成["foo", "bar", 0]的可遍历片段,自动区分对象键(字符串)和数组下标(数字)。 - 深拷贝隔离:通过
JSON.parse(JSON.stringify())复制原始对象,保证原数据不受修改;如果需要直接修改原对象,可去掉这一步直接操作payload。 - 嵌套结构自动创建:遍历路径片段时,逐个检查节点是否存在,不存在则根据下一个节点的类型初始化(数字下标对应数组,否则对应对象);如果遇到数组下标超出当前数组长度的情况,会自动填充空值到指定下标位置,确保赋值有效。
- 最终赋值:遍历到最后一个路径片段时,给对应位置设置目标值。
测试场景
场景1:空对象初始化
const obj = {}; const newObj = setPath(obj, "foo.bar[0]", "wut"); console.log(newObj); // 输出:{ foo: { bar: [ 'wut' ] } }
场景2:已有部分嵌套结构
const obj = { foo: { bar: [] } }; const newObj = setPath(obj, "foo.bar[0]", "wut"); console.log(newObj); // 输出:{ foo: { bar: [ 'wut' ] } }
补充说明
- 函数支持连续数组下标的路径,比如
"foo[0][1].name"这类格式也能正确处理。 - 若需要处理函数、Symbol等
JSON.parse无法兼容的特殊类型,可替换为递归实现的深拷贝函数。
内容的提问来源于stack exchange,提问作者Solon
相关产品推荐
相关产品推荐

