关于javascript:Day-2100-手写实现URLSearchParams

前言

1、办法阐明

办法 作用
URLSearchParams.append() 插入一个指定的键/值对作为新的搜寻参数。
URLSearchParams.delete() 从搜寻参数列表里删除指定的搜寻参数及其对应的值。
URLSearchParams.entries() 返回一个iterator能够遍历所有键/值对的对象。
URLSearchParams.get() 获取指定搜寻参数的第一个值。
URLSearchParams.getAll() 获取指定搜寻参数的所有值,返回是一个数组。
URLSearchParams.has() 返回 Boolean 判断是否存在此搜寻参数。
URLSearchParams.keys() 返回iterator 此对象蕴含了键/值对的所有键名。
URLSearchParams.set() 设置一个搜寻参数的新值,如果原来有多个值将删除其余所有的值。
URLSearchParams.sort() 按键名排序。
URLSearchParams.toString() 返回搜寻参数组成的字符串,可间接应用在URL上。
URLSearchParams.values() 返回iterator 此对象蕴含了键/值对的所有值。

2、实现代码

class MyURLSearchParams {
    /**
     * @params {string} init
     */
    constructor(init) {
     this.val=''
        if(init.indexOf('http')>-1){
            this.val=init
        }else{
            this.val=init.slice(init.indexOf('?')+1)
        }
        this.arr=this.val.split('&')
        // console.log(this.val);
    }
    
    /** 
     * @params {string} name
     * @params {any} value
     */
    append(name, value) {
      let tmp=name+'='+value
      this.arr.push(tmp)
      return '?'+this.arr.join('&')
    }
    
    /**
     * @params {string} name
     */
    delete(name) {
        let res=[]
        for(let i=0; i<this.arr.length; i++) {
            if(this.arr[i].indexOf(name)!=0){
                res.push(this.arr[i])
            }
        }
        this.arr=res
        return '?'+this.arr.join('&')
    }
    
    /**
     * @returns {Iterator} 
     */
    *entries() {
        let res=[]
        for(let i=0; i<this.arr.length; i++) {
            let tmp=this.arr[i].split('=')
            yield [tmp[0],tmp[1]]
        }
    }
    
    /**
     * @param {(value, key) => void} callback
     */
    forEach(callback) {
        for(let i=0; i<this.arr.length; i++) {
            let tmp=this.arr[i].split('=')
            let obj={}
            callback(tmp[1],tmp[0])
        }
    }
    /**
     * @param {string} name
     * returns the first value of the name
     */
    get(name) {
      let res=null
      this.arr.filter((value) => {
          if((res==null)&&(value.indexOf(name)==0)){
              let tmp=value.split('=')
              res=tmp&&tmp[1]
          }
      })
      return res
    }
    /**
     * @param {string} name
     * @return {string[]}
     * returns the value list of the name
     */
    getAll(name) {
        let res=[]
        this.arr.filter((value) => {
            if(value.indexOf(name)==0){
                let tmp=value.split('=')
                res.push(tmp[1])
            }
        })
        return res
    }
    
    /**
     * @params {string} name
     * @return {boolean}
     */
    has(name) {
        let res=false
        this.arr.filter((value) => {
            if((res==false)&&(value.indexOf(name)==0)){
                let tmp=value.split('=')
                res=tmp.length>0?true:false
            }
        })
        return res
    }
    /**
     * @return {Iterator}
     */
    keys() {
        let res=[]
        for(let i=0; i<this.arr.length; i++) {
            let tmp=this.arr[i].split('=')
            if(!res.includes(tmp[0])){
                res.push(tmp[0])
            }
        }
        return res
    }
    
    /**
     * @param {string} name
     * @param {any} value
     */
    set(name, value) {
        let tmp=0
        for(let i=0; i<this.arr.length; i++) {
            if(this.arr[i].indexOf(name)==0){
              tmp+=1
                this.arr[i]=name+'='+value
            }
        }
        if(tmp==0){
            this.arr.push(name+'='+value)
        }
        return '?'+this.arr.join('&')
    }
    
    // sor all key/value pairs based on the keys
    sort() {
        let res=[]
        for(let i=0; i<this.arr.length; i++) {
            let tmp=this.arr[i].split('=')
            res.push(tmp)
        }
        res.sort(function(a,b){
            if(a[0]>b[0]){
                return 1
            }else{
                return -1
            }
          }
        )
        let sum=[]
        res.forEach((value) => {
            sum.push(value.join('='))
        })
        this.arr=sum
        return res
    }
    
    /**
     * @return {string}
     */
    toString() {
      return this.arr.join('&')
    }
    /**
     * @return {Iterator} values
     */
    values() {
        let res=[]
        for(let i=0; i<this.arr.length; i++) {
            let tmp=this.arr[i].split('=')
            if(!res.includes(tmp[0])){
                res.push(tmp[1])
            }
        }
        return res
    }
  }

参考链接

https://developer.mozilla.org…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理