我有一个简单的对象:

   let obj = {
      season: 'winter',
      data: {
          month: ['December', 'January', 'February']
         }
    };

我需要获得如下字符串:

`season=winter&data[month][0]=December&data[month][1]=January&data[month][2]=February`

我试过了,但没有完全成功

function convertToText(obj) {
  let string = [];
  if (typeof(obj) == "object") {
    for (prop in obj) {
      if (obj.hasOwnProperty(prop))
        string.push(prop + "=" + convertToText(obj[prop]));
    };
    return string.join("&");
  } else {
    string.push(JSON.stringify(obj))
  }

  return string.join();
}

let obj = {
  season: 'winter',
  data: {
    month: ['December', 'January', 'February']
  }
};

console.log(convertToText(obj));

结果是这样的:

"season='winter'&data=month=0='December'&1='January'&2='February'"

推荐答案

递归地遍历整个对象层次 struct ,跟踪将用作"key=value"对的前缀的路径.

可以特殊处理数组--数组值的键以及它的任何索引都需要用方括号括起来.

最后,基本情况是将前缀转换为等号的左侧,并将纯值转换为右侧.

const isPlainObject = data =>
  typeof data === "object" 
    && data !== null 
    && !Array.isArray(data);

const arrayKey = (prefix, index) =>
  prefix
    //take every element except the last one:
    .slice(0, -1)
    //append last element and index enclosed in square brackets:
    .concat(`[${prefix.at(-1)}]`, `[${index}]`); 

function convertToText(data, prefix = []) {
  if (isPlainObject(data))
      return Object.entries(data)
        .map(([key, value]) => convertToText(value, prefix.concat(key)))
        .join("&");
  
  if (Array.isArray(data))
    return data
        .map((x, index) => convertToText(x, arrayKey(prefix, index)))
        .join("&")
    
    return `${prefix.join("")}=${data}`;
};

let obj = {
  season: 'winter',
  data: {
    month: ['December', 'January', 'February']
  }
};

console.log(convertToText(obj));

Javascript相关问答推荐

无法检测卡片重叠状态的问题

无法从NextJS组件传递函数作为参数'

如何在JavaScript文件中使用Json文件

当id匹配时对属性值求和并使用JavaScript返回结果

确保函数签名中的类型安全:匹配值

第三方包不需要NODE_MODULES文件夹就可以工作吗?

使用自动识别发出信号(&Q)

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

基于产品ID更新条带产品图像的JavaScript命中错误

FileReader()不能处理Firefox和GiB文件

在渲染turbo流之后滚动到元素

如何通过Axios在GraphQL查询中发送数组

按特定顺序将4个数组组合在一起,按ID分组

是否有静态版本的`instanceof`?

JavaScript structuredClone在Chrome/Edge中获得了非法调用,但在NodeJS中没有

打字脚本中的函数包装键入

更改输入文本框的背景时出现问题

无法从fixture 文件中提取数据

Zimjs库:如何让ZIM帧初始化日志(log)消失

如何制作弹出式滑出动画