JS递归实现任意嵌套对象转指定格式字符串的问题求助
问题解决:嵌套JavaScript对象转特定格式字符串
需求回顾
需要编写递归函数,将任意嵌套的JavaScript对象转换为类似URL查询参数的格式,示例如下:
输入对象:
let obj = { season: 'winter', data: { month: ['December', 'January', 'February'] } };
期望输出字符串:
season=winter&data[month][0]=December&data[month][1]=January&data[month][2]=February
原代码问题分析
你提供的代码存在三个核心问题:
- 未维护嵌套路径前缀:递归时直接将当前属性与子结果用
=连接,导致嵌套结构错误(比如data=month=0='December'),没有按要求用[键名/索引]扩展路径。 - 基础类型处理冗余:使用
JSON.stringify处理基础类型,会给字符串额外添加引号(比如'winter'),不符合预期格式。 - 数组与对象未区分处理:将数组当作普通对象遍历,直接使用索引作为属性名,导致数组元素的路径拼接错误。
正确实现代码
以下是修复后的递归函数,完全符合需求:
function convertToText(obj) { const parts = []; // 递归遍历函数,维护当前路径前缀 function traverse(current, path) { // 处理数组类型 if (Array.isArray(current)) { current.forEach((item, index) => { const newPath = path ? `${path}[${index}]` : `${index}`; traverse(item, newPath); }); } // 处理普通对象(排除null,因为typeof null === 'object') else if (typeof current === 'object' && current !== null) { Object.entries(current).forEach(([key, value]) => { const newPath = path ? `${path}[${key}]` : key; traverse(value, newPath); }); } // 处理基础类型(字符串、数字、布尔值等) else { parts.push(`${path}=${current}`); } } // 初始调用,路径前缀为空 traverse(obj, ''); return parts.join('&'); }
测试验证
用示例对象测试:
let obj = { season: 'winter', data: { month: ['December', 'January', 'February'] } }; console.log(convertToText(obj)); // 输出:season=winter&data[month][0]=December&data[month][1]=January&data[month][2]=February
代码逻辑说明
- 路径维护:通过内部递归函数
traverse的path参数,持续拼接当前嵌套层级的路径,确保嵌套对象/数组的路径格式正确(比如data[month][0])。 - 类型区分处理:
- 数组:遍历元素时用索引拼接路径(
[索引])。 - 普通对象:遍历键值对时用键名拼接路径(
[键名])。 - 基础类型:直接拼接成
路径=值的形式,存入结果数组。
- 数组:遍历元素时用索引拼接路径(
- 结果拼接:最后将所有键值对片段用
&连接,得到最终字符串。
内容的提问来源于stack exchange,提问作者Evgeniy Fayzrakhmanov
相关产品推荐
相关产品推荐

