Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >前端算法-解析URL字符串

前端算法-解析URL字符串

作者头像
Careteen
发布于 2022-02-14 08:29:31
发布于 2022-02-14 08:29:31
63000
代码可运行
举报
文章被收录于专栏:源码揭秘源码揭秘
运行总次数:0
代码可运行

前言

写一个程序parse,解析下面的queryString,返回一个对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(parse('a=1&b=2&c=3')) // => { a: '1', b: '2', c: '3' }
console.log(parse('a&b&c')) // => {}
console.log(parse('a[name][second]=careteen&a[company]=sohu&b=y')) // => { a: { name: { second: 'careteen' }, company: 'sohu' }, b: 'y' }
console.log(parse('color=Deep%20Blue')) // => { color: 'Deep Blue' }
console.log(parse('a[0]=1&a[1]=2')) // => { a: [ '1', '2' ] }

分析

首先要先了解url参数的规则

  • &或其他字符进行分割,且以=分割键值对
  • &=分割时可能没有值
  • =后面的值可能已经encodeURIComponent转码,需要解码
  • 可能会是一个多层级的对象a[name][second]=careteen&a[company]=sohu&b=y,需要按层级设置对象
  • 对象的键可能为一个数字a[0]=1&a[1]=2,此时应该处理返回成数组

实现

针对上述分析其规则,解析一个URL需要考虑诸多情况。

具体代码和测试用例实现

下面给出具体实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @desc 解析URL
 * @param {String} str 
 * @param {Object} options 
 * @param {String} options.delimiter // 分隔符
 */
const parse = (str, options = {}) => {
  let config = Object.assign({
    delimiter: '&'
  }, options)

  return str.split(config.delimiter).reduce((ret, cur) => {
    let [key, value] = cur.split('=')
    if (!value) return ret
    // ret[key] = value
    deepSet(ret, key, value)
    return ret
  }, {})
}

辅助函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @desc 辅助函数 深层级设置
 */
const deepSet = (ret, key, value) => {
  /* eslint-disable */
  let path = key.split(/[\[\]]/g).filter(item => !!item)
  // console.log(path)
  let i = 0
  for (; i < path.length - 1; i++) {
    if (ret[path[i]] === undefined) {
      if (path[i + 1].match(/^\d+$/)) {
        ret[path[i]] = []
      } else {
        ret[path[i]] = {}
      }
    }
    ret = ret[path[i]]
  }
  ret[path[i]] = decodeURIComponent(value)
  // console.log(ret)
}

测试用例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(parse('a=1&b=2&c=3')) // => { a: '1', b: '2', c: '3' }
console.log(parse('a&b&c')) // => {}
console.log(parse('a[name][second]=careteen&a[company]=sohu&b=y')) // => { a: { name: { second: 'careteen' }, company: 'sohu' }, b: 'y' }
console.log(parse('color=Deep%20Blue')) // => { color: 'Deep Blue' }
console.log(parse('a[0]=1&a[1]=2')) // => { a: [ '1', '2' ] }

总结

解析字符串看似简单,实则考察诸多知识点

  • 使用reduce去简化流程
  • 考虑URL规则满足各种需求
  • 检验对正则的掌握
  • 深层级对象的设置需要使用循环去合理设置
  • 区分数组和对象两种场景
  • 别忘了解码
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
盘点操作URL中常用的几个高效API
通常在实际项目中,无论操作数据、或是dom,我们需要熟悉一些浏览器的API,或是js原生给我们扩展的API,我们熟悉了这些API,某种意义上来说,一些高效的API和方法常常会解惑你项目中遇到的很多疑难杂症。
Maic
2022/07/28
1.1K0
盘点操作URL中常用的几个高效API
【Nodejs】240-有助于理解前端工具的 node 知识
缘起 平时写惯了业务代码之后,如果想要了解下 webpack 或者 vue-cli,好像是件很难上手的事情? 。拿 webpack 来说,我们可能会对配置熟悉点,但常常一段时间过后又忘了,感觉看起来不
pingan8787
2019/07/25
4780
【Nodejs】240-有助于理解前端工具的 node 知识
【前端】提取URL中的各个GET参数
zhaokang555
2023/10/17
2530
揭秘 Rollup Tree Shaking
Next-generation ES module bundler官网定义此为下一代ES模块捆绑器。
Careteen
2022/02/14
2.9K0
揭秘 Rollup Tree Shaking
封装QueryString构造函数,实现stringify、parse方法
要求给出 实现QueryString 构造函数身上的 stringify 和 parse 方法
心安事随
2024/07/29
1320
JS 字符串截取
1、charAt() charAt() 方法可返回指定位置的字符。 <script type="text/javascript"> var str="Hello world!"; document.write(str.charAt(1); </script> 2、获取字符串中所有数字。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </he
White feathe
2021/12/08
14.5K0
js模板字符串中使用循环遍历数据
模板字符串可以嵌入变量, 模板字符串使用反引号 (` `) 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法({expression})的占位符。我们经常用的是`my name is {name}`,如果是下面的格式,怎么处理比较方便
tianyawhl
2021/07/27
5.6K0
前端面试题 原
我们在js的学习中,往往很多东西看过之后,一段时间不用,就忘记了。或者当时就没有深入的理解,能促使我们不断深入学习的动力最好的办法往往参加些面试,能找到自己的不足也能加深之前学的知识点的记忆。
tianyawhl
2019/04/04
4240
JS小知识,如何将 CSV 转换为 JSON 字符串
您可以使用 csvtojson 库在 JavaScript 中快速将 CSV 转换为 JSON 字符串:
前端达人
2023/02/17
8.1K0
JS小知识,如何将 CSV 转换为 JSON 字符串
【NPM库】- 0x04 - Mock Data
Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发更加独立自主,不会被服务端的开发所阻塞。
WEBJ2EE
2020/08/18
8860
字符串与JSON
一、代码习题 1.使用数组拼接出如下字符串 ,其中styles数组里的个数不定 var prod = { name: '女装', styles: ['短款', '冬季', '春装'] }; function getTpl(data){ //todo... }; var result = getTplStr(prod); //result为下面的字符串 <dl class="product"> <dt>女装</dt> <dd>短款</dd> <dd>冬季</dd>
小胖
2018/06/27
3.2K0
JS开发常用工具函数
内置函数toString后的主体代码块为 [native code] ,而非内置函数则为相关代码,所以非内置函数可以进行拷贝(toString后掐头去尾再由Function转)
ConardLi
2019/07/04
2.4K0
《Node.js权威指南》:转换URL字符串与查询字符串
在HTTP服务中,服务器端可以从客户端请求所用的url中获取很多信息。nodejs中有url模块和queryString模块,分别用来获取完整url字符串中信息和查询字符串中信息。
前端_AWhile
2019/08/29
2K0
《Node.js权威指南》:转换URL字符串与查询字符串
JS 获取URL中的参数值
本文由 Alone88 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名 最后编辑时间为: Sep 11, 2019 at 11:40 am
Alone88
2019/10/22
18.1K0
如何使用 JavaScript 解析 URL
在 Web 开发中,有许多情况需要解析 URL,这篇主要学习如何使用 URL 对象实现这一点。
前端小智@大迁世界
2019/03/15
2.8K0
如何使用 JavaScript 解析 URL
AJAX
先了解JSON 什么是JSON? JSON 指的是JavaScript对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 JSON 具有自我描述性,更易理解   JSON 使用JavaScript语法来描述数据对象,但是JSON仍然独立与语言和平台。JSON解释器和JSON库支持许多不同的编程语言。 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次
新人小试
2018/04/12
4.4K0
AJAX
JavaScript常见手写题熬夜整理
题目描述:有一组版本号如下 ['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']。现在需要对其进行排序,排序的结果为 ['4.3.5','4.3.4.5','2.3.3','0.302.1','0.1.1']
helloworld1024
2022/09/22
8980
querystring模块详解
parse方法还有三个可选参数,分别是分隔符(默认为&),赋值符(默认为=),以及配置对象,配置对象又有两个可选参数,分别是````maxKeys(最多能解析多少个键值对)和decodeURIComponent(用于解码非utf-8编码字符串,默认为querystring.unescape```)。 例如:
用户2936342
2018/08/27
1.1K0
50 个让你高效编程的前端轮子,真香
https://segmentfault.com/a/1190000038589634
@超人
2021/04/26
7.8K0
js-字符串方法
chartAt()以单字符字符串的形式返回给定位置的那个字符。而charCodeAt()返回的是字符编码。
eadela
2019/09/29
5K0
js-字符串方法
相关推荐
盘点操作URL中常用的几个高效API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验