封装QueryString构造函数,实现stringify、parse方法

简介: 【7月更文挑战第2天】实现QueryString构造函数,包含`stringify`和`parse`方法。`stringify`将对象转换为查询字符串,如`?a=1&b=2&c=1,2`。第一种实现使用for循环和模板字符串,第二种实现利用ES6的`Object.keys`, `map`和`join`。`parse`方法将查询字符串转换回对象,处理数组情况。主要使用`split`方法拆分字符串并遍历处理。

实现QueryString

题目要求:

  1. 给定一个对象{a:1,b:2,c:[1,2] }
  2. 输出一个查询字符串 ?a=1&b=2&c=1,2

要求给出 实现QueryString 构造函数身上的 stringify 和 parse 方法

stringify

我们先来实现一下stringify 方法

首先呢 我们先定义构造函数

  • 接收两个参数 pre : 前缀 和seq : 分隔符
 function QueryString(pre,seq){
   

 }

在这个构造函数身上添加一个stringify 方法

  • 这个函数接收一个对象
  • 遍历这个对象
  • 拿到key 和 value 值 以及 seq 分隔符 进行拼接
  • 然后追加在str 身上
  • 最后针对str 身上的最后的分割符 进行 去除 (slice|| substring)
 QueryString.prototype.stringify = function(obj){
   
     //1. 定义字符串
     let str = this.pre // 定义一个字符串 然后值为传过来的前缀
     //2. 遍历obj 对象
     for(let key in obj){
   
         // key : 为obj 对象的key值 即 键名 
         // obj[key] : 通过这种方式取到对应键值的value值
         //   模板字符串 进行拼接即可
         //   最后追加在str 变量身上
         str += `${
     key}=${
     obj[key]}${
     this.seq}`
     }
     return str.slice(0,-1) // 去除字符串最后的分隔符 然后进行返回
 }

好, 第一种原始的方法 我们 已经介绍完毕了剩下我们介绍一种使用es6 新api 解决的方案 只需要一行代码 即可完成功能呢

  • Object.keys() 静态方法返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。
  • map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成
  • join() 方法将数组中所有元素连接为一个字符串。
 QueryString.prototype.stringify = function (obj) {
   
     return this.pre + Object.keys(obj).map(k => k + '=' + obj[k]).join(this.seq)
 }

我们来进行拆解一下:

  1. this.pre = ?

  2. Object.keys(obj) = [a,b,c]

  3. [a,b,c].map(k = > console.log(k,obj[k]))

    a 1

    b 2

    c [1,2]

  4. k + '=' + obj[k]

a=1

b=2

c=1,2

因为map 之后 会返回一个新的数组 经过上面的处理之后 我们目前的数组变成了

['a=1', 'b=2', 'c=1,2']

再之后 进行 join 拼接 得到一个含有指定符号(取决于传给join 的 符号)的字符串

'a=1&b=2&c=1,2'

再之后 加上前缀 this.pre? 即可完成了

?a=1&b=2&c=1,2

parse

题目要求:

输入

'?a=1&b=2&c=1,2'

输出

{a: '1', b: '2', c: ['1','2']}

好嘞,我们开始吧

还是和上面一样在构造函数的原型上添加方法 该方法接收一个字符串为参数

 QueryString.prototype.parse = function (str) {
   }

首先我们需要生成一个对象, 因为题目最后要求输出一个对象,也表示我们需要在该方法return一个对象

 QueryString.prototype.parse = function (str) {
   
     // 生成一个对象 最后需要返回u
     let result ={
   }
     return result
 }

其次我们先打印一个str (这里已经调用该方法 并传入'?a=1&b=2&c=1,2') 了

?a=1&b=2&c=1,2

这里我们先观察一下这个字符串, 可以划分一下

? || a=1 || & || b=2 || & || c=1,2

我们先把? 作为标识符号即 this.pre 即我们之前在构造函数身上添加的属性 进行分割

下面的代码将会返回

 str.split(this.pre)  // [' ', 'a=1&b=2&c=1,2']

接下来我们可以直接使用索引取出这个数组第二个值a=1&b=2&c=1,2

a=1 || & || b=2 || & || c=1,2

此时我们继续重复上面的步骤来, 继续进行分割,按照`分隔符 `

 str.split(this.pre)[1].split(this.seq) //  ['a=1', 'b=2', 'c=1,2']

好,现在我们已经拿到我们想要的内容了,接下来呢 我们想的是取

a ---> key

1 ---> value

然后进行obj对象的赋值

我们现在是个数组, 然后针对这样的数组 我们需要取出里面的每一项用

forEach是一个用于数组的方法,用于遍历数组的每个元素并执行指定的操作。它接受一个回调函数作为参数,并将数组的每个元素依次传递给回调函数进行处理。

 const s1 = str.split(this.pre)[1].split(this.seq)
 s1.forEach((item)=>{
   
     console.log(item) // 
 })

item:

a=1

b=2

c=1,2

看到=号,我们还需要进行分割,因为这样不仅可以去除 = , 还有就是 把 a1 放入一个数组里面,并且独立的项

即 item.split('=') --> ['a','1']

然后分别抽离key 和 value

即 const k = item.split('=')[0] const v = item.split('=')[1]

再给对象赋值之前还有一步 原本c 是一个数组,所以我们需要进行if判断

       if (v.includes(',')) {
   
             // 继续分割 因为'1,2' 字符 按照,号分割 -->> ['1','2']
             result[k] = v.split(',')
         } else {
   
             result[k] = v
         }

好了, 至此代码结束

下面是完整的代码, 其实没有多少, 主要考察 字符串切割split()

 QueryString.prototype.parse = function (str) {
   
     // 生成一个对象 最后需要返回u
     let result = {
   }
     // 首先我们先进行字符的分割 --> 拿到我们主要内容
     const s = str.split(this.pre)s[1].split(this.seq)
     // 好,这个时候我们已经拿到我们想要的内容, 然后进行
     // 循环遍历
     s.forEach((item) => {
   
         // 解构赋值 -- 一一对应
         const [k,v] = item.split('=')
         if (v.includes(',')) {
   
             result[k] = v.split(',')
         } else {
   
             result[k] = v
         }
     })
     return result
 }
目录
相关文章
|
Java
基于Java对STOMP服务端进行测试
在10000用户的并发下,客户端连接用时 5.5秒,500万条数据发送用时 55秒左右
981 0
|
网络协议 Shell Android开发
解决adb网络连接中出现的“由于目标计算机积极拒绝,无法连接”错误
解决adb网络连接中出现的“由于目标计算机积极拒绝,无法连接”错误
解决adb网络连接中出现的“由于目标计算机积极拒绝,无法连接”错误
|
SQL 缓存 Java
SpringBoot系列教程JPA之update使用姿势
上面两篇博文拉开了jpa使用姿势的面纱一角,接下来我们继续往下扯,数据插入db之后,并不是说就一层不变了,就好比我在银行开了户,当然是准备往里面存钱了,有存就有取(特别是当下银行利率这么低还不如买比特币屯着,截止19年6月22日,btc已经突破1.1w$,可惜没钱买😭)这就是我们今天的主题,数据更新--update的使用姿势
1371 0
SpringBoot系列教程JPA之update使用姿势
UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号
UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号
481 0
|
机器学习/深度学习 边缘计算 PyTorch
PyTorch 与 ONNX:模型的跨平台部署策略
【8月更文第27天】深度学习模型的训练通常是在具有强大计算能力的平台上完成的,比如配备有高性能 GPU 的服务器。然而,为了将这些模型应用到实际产品中,往往需要将其部署到各种不同的设备上,包括移动设备、边缘计算设备甚至是嵌入式系统。这就需要一种能够在多种平台上运行的模型格式。ONNX(Open Neural Network Exchange)作为一种开放的标准,旨在解决模型的可移植性问题,使得开发者可以在不同的框架之间无缝迁移模型。本文将介绍如何使用 PyTorch 将训练好的模型导出为 ONNX 格式,并进一步探讨如何在不同平台上部署这些模型。
1462 2
|
数据可视化
Echarts动态数据可视化学习(2)柱状图和折线图的动态数据更新
Echarts动态数据可视化学习(2)柱状图和折线图的动态数据更新
521 0
|
消息中间件 缓存 JavaScript
Nacos+@RefreshScope 为什么配置能动态刷新?
Nacos+@RefreshScope 为什么配置能动态刷新?
|
SQL 监控 关系型数据库
深入解析MySQL死锁:原因、检测与解决方案
深入解析MySQL死锁:原因、检测与解决方案
|
消息中间件 存储 缓存
RocketMQ 监控告警:生产环境如何快速通过监控预警发现堆积、收发失败等问题?
本文主要向大家介绍如何利用 RocketMQ 可观测体系中的指标监控,对生产环境中典型场景:消息堆积、消息收发失败等场景配置合理的监控预警,快速发现问题,定位问题。
2141 0
RocketMQ 监控告警:生产环境如何快速通过监控预警发现堆积、收发失败等问题?

热门文章

最新文章