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

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

原代码问题分析

你提供的代码存在三个核心问题:

  1. 未维护嵌套路径前缀:递归时直接将当前属性与子结果用=连接,导致嵌套结构错误(比如data=month=0='December'),没有按要求用[键名/索引]扩展路径。
  2. 基础类型处理冗余:使用JSON.stringify处理基础类型,会给字符串额外添加引号(比如'winter'),不符合预期格式。
  3. 数组与对象未区分处理:将数组当作普通对象遍历,直接使用索引作为属性名,导致数组元素的路径拼接错误。

正确实现代码

以下是修复后的递归函数,完全符合需求:

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

代码逻辑说明

  1. 路径维护:通过内部递归函数traverse的path参数,持续拼接当前嵌套层级的路径,确保嵌套对象/数组的路径格式正确(比如data[month][0])。
  2. 类型区分处理:
    • 数组:遍历元素时用索引拼接路径([索引])。
    • 普通对象:遍历键值对时用键名拼接路径([键名])。
    • 基础类型:直接拼接成路径=值的形式,存入结果数组。
  3. 结果拼接:最后将所有键值对片段用&连接,得到最终字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:35:19