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

苹果面试题:JavaScript实现URL查询字符串转对象

JavaScript URL查询参数转对象实现方案

题目要求:输入URL字符串http://www.apple.com?a=1&b=2&c=3,不硬编码参数键名,输出格式为{a:1, b:2, c:3}的普通对象。


方案1:使用原生URL构造函数(推荐)

这是JS原生提供的URL处理API,浏览器、Node.js环境均原生支持,无需额外依赖,也不需要硬编码任何参数规则,自动适配任意查询参数结构。
实现代码:

function parseQuery(url) {
  const params = new URL(url).searchParams;
  const res = {};
  for (const [key, val] of params.entries()) {
    // 自动把数值类字符串转成数字类型,非数值保留原字符串
    res[key] = isNaN(Number(val)) ? val : Number(val);
  }
  return res;
}

// 测试用例
const input = 'http://www.apple.com?a=1&b=2&c=3';
console.log(parseQuery(input)); // 输出 {a: 1, b: 2, c: 3}

方案优势:自动处理URL编码、特殊字符、参数值带=/?等边界场景,代码简洁鲁棒,覆盖所有现代运行环境。


方案2:不依赖URL构造函数的手写实现

如果不了解URL构造函数,可以通过原生字符串操作实现通用解析逻辑,全程不硬编码参数键名,适配任意合法URL格式。
核心实现逻辑:

  • 定位URL中?的位置,截取后面的查询字符串部分,提前过滤掉#开头的哈希片段
  • 按&拆分查询字符串,得到每一组独立的键值对
  • 对每组键值对按=拆分,分别解码键名和值的URL编码
  • 对值做类型判断,数值类内容转成Number类型后存入结果对象

实现代码:

function parseQueryManual(url) {
  const res = {};
  const queryStart = url.indexOf('?');
  // 无查询参数直接返回空对象
  if (queryStart === -1) return res;
  // 截取查询串,同时剔除哈希部分
  const searchPart = url.slice(queryStart + 1).split('#')[0];
  const paramList = searchPart.split('&');

  for (const item of paramList) {
    // 跳过空参数项(比如连续&&的异常场景)
    if (!item) continue;
    const [key, rawVal] = item.split('=');
    const decodeKey = decodeURIComponent(key);
    const decodeVal = decodeURIComponent(rawVal ?? '');
    // 类型转换
    res[decodeKey] = isNaN(Number(decodeVal)) ? decodeVal : Number(decodeVal);
  }
  return res;
}

// 测试用例
const input = 'http://www.apple.com?a=1&b=2&c=3';
console.log(parseQueryManual(input)); // 输出 {a: 1, b: 2, c: 3}

注意:手写基础版本仅覆盖常规场景,如果要适配生产环境复杂情况,还需要补充同名多参数、参数值为空、非法编码等边界逻辑的处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:09:49