img

前端URL参数的解析和编码

2023-07-11 0条评论 440次阅读 JavaScript


实现一个函数用来解析 URL 的 querystring

示例如下:

const url = "https://shanyue.tech?a=3&b=4&c=5";

// 解析后得到 qs 如下
const qs = {
  a: 3,
  b: 4,
  c: 5,
};
function url2Params(url) {
  const dict = {};
  url.replace(/([^?&]*)=([^&]*)/g, (__, key, val) => {
    key = decodeURIComponent(key);
    val = decodeURIComponent(val);
    if (dict[key]) return (dict[key] = [dict[key], val].flat());
    dict[key] = val;
  });
  return dict;
}

实现一个函数用来对 URL 的 querystring 进行编码

示例如下:

const data = {
  a: 3,
  b: 4,
  c: 5,
};

// 对 data 编码后得到 querystring 如下
//=> 'a=3&b=4&c=5'
stringify(data);

先上几个测试用例:

// a=3&b=4
stringify({ a: 3, b: 4 });

// a=3&b=
stringify({ a: 3, b: null });

// a=3&%E5%B1%B1=%E6%9C%88
stringify({ a: 3, 山: "月" });

只做一些基本的功能,满足以下条件

  1. 对 null/undefined/object 编码为空字符
  2. 对 key/value 记得 encodeURIComponent
  3. 不考虑数组及嵌套对象等复杂操作
function stringify(data) {
  const pairs = Object.entries(data);
  const qs = pairs
    .map(([k, v]) => {
      let noValue = false;
      if (v === null || v === undefined || typeof v === "object") {
        noValue = true;
      }
      return `${encodeURIComponent(k)}=${noValue ? "" : encodeURIComponent(v)}`;
    })
    .join("&");
  return qs;
}

这是一个最简单对 querystring 进行编码的函数,如果需要更复杂的需求如嵌套对象与数组可以参考 qs

💬 COMMENT


🦄 支持markdown语法

👋友