📌  相关文章
📜  如何使用 JavaScript 将对象序列化为 URL 查询参数列表?(1)

📅  最后修改于: 2023-12-03 15:38:02.515000             🧑  作者: Mango

如何使用 JavaScript 将对象序列化为 URL 查询参数列表

在 Web 开发中,我们经常需要将对象转换为 URL 查询参数列表的形式,例如发送 AJAX 请求或者跳转页面时使用。在 JavaScript 中,我们可以使用 encodeURIComponent 函数将字符串编码为 URL 安全的格式,然后拼接到 URL 中。但是,对于包含多个属性的对象,这种方式非常麻烦和冗长,我们需要逐个拼接属性和值,还需要处理不同数据类型的情况。

为了简化这个过程,我们可以编写一个通用的函数,将对象序列化为 URL 查询参数列表的形式。下面介绍一种基于递归的实现方法:

/**
 * 将对象序列化为 URL 查询参数列表的形式
 * @param {Object} obj 要序列化的对象
 * @param {string} prefix 参数前缀,用于递归处理对象属性
 */
function serialize(obj, prefix) {
  const parts = [];
  for (const prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      const key = prefix ? `${prefix}[${prop}]` : prop;
      const val = obj[prop];

      if (val !== null && typeof val === 'object') {
        // 递归序列化对象属性
        parts.push(serialize(val, key));
      } else if (val !== undefined) {
        // 拼接编码后的属性和值
        parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(val)}`);
      }
    }
  }
  return parts.join('&');
}

这个函数接受两个参数,要序列化的对象和参数前缀。如果传入了前缀,会用中括号括起来作为对象属性的名字。函数遍历对象的属性,如果是对象则递归序列化,如果不是则将属性和值拼接为编码后的字符串。最后返回拼接好的参数列表,用 & 连接每个字段。

下面是一个示例,展示了如何将一个对象序列化为 URL 查询参数列表的形式:

const params = {
  name: '张三',
  age: 18,
  address: {
    province: '广东省',
    city: '深圳市',
    street: '南山区科技园',
  },
  hobbies: ['游泳', '阅读'],
};

console.log(serialize(params)); // name=%E5%BC%A0%E4%B8%89&age=18&address[province]=%E5%B9%BF%E4%B8%9C%E7%9C%81&address[city]=%E6%B7%B1%E5%9C%B3%E5%B8%82&address[street]=%E5%8D%97%E5%B1%B1%E5%8C%BA%E7%A7%91%E6%8A%80%E5%9B%AD&hobbies%5B%5D=%E6%B8%B8%E6%B3%B3&hobbies%5B%5D=%E9%98%85%E8%AF%BB

运行结果中,每个属性和值都被编码为 URL 安全的格式,并用 & 连接起来作为参数列表。

总结一下,我们可以使用递归的方法将对象序列化为 URL 查询参数列表的形式,避免手动拼接每个属性和值。通过 encodeURIComponent 函数对属性和值进行编码,保证参数的安全性。这个函数可以广泛应用于 Web 开发中需要使用 URL 参数的场景,例如发送 AJAX 请求或者跳转页面时使用。