基本使用方法如下

/*
* URLSearchParams属性
* @语法:new URLSearchParams(parameter);
*/
(function(){
var str = "http://www.domain.com/?user=Alan&id=123&id=456";
var searchParams = new URLSearchParams(str);
// let...of 语法(迭代对象)
for(let p of searchParams){
// console.log(p);
}
/*
* URLSearchParams.append()
* @添加新的key/value到URL中
*/
searchParams.append("city", encodeURIComponent("深圳")); /*
* URLSearchParams.has()
* @查询是否存在,返回一个boolean值
*/
searchParams.has("id"); // true
/*
* URLSearchParams.get()
* @返回相关联的第一个值
*/
searchParams.get("id"); // /*
* URLSearchParams.getAll()
* @返回所有相同key的值
*/
searchParams.getAll("id"); // ["123", "456"] /*
* URLSearchParams.set()
* @设置key的value值,如果有多个,删除其他的
*/
searchParams.set("id", "789"); /*
* searchParams.delete()
* @删除所有参数列表key与value值,重复的key都被删除
*/
searchParams.delete("id"); /*
* searchParams.entries()
* @返回所有键值对key/value
*/
for(let pair of searchParams.entries()){
console.log(pair[0]+ ', '+ pair[1]);
} /*
* searchParams.keys()
* @返回所有键key
*/
for(let key of searchParams.keys()){
console.log(key);
} /*
* searchParams.values()
* @返回所有值
*/
for(let value of searchParams.values()) {
console.log(value);
} /*
* searchParams.toString()
* @返回修改过的URL
*/
searchParams.toString();
console.log(searchParams.toString());
}());

JS 编写函数从下面的 URL 串中解析出所有的参数

http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&d&enabled

期望的返回结果格式如下:

{
user: 'anonymous',
id: [123, 456], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
city: '北京', // 中文
enabled: true, // 未指定值的 key 约定值为 true
}

谋定而后动,动手前一定要搞清楚问题。怎样才算是把问题搞清楚了?要清楚输入的特征,是否会出现各种奇怪的输入

防御性编程,检测是否为字符串

function parse(str){
if(typeof str !== "string"){
return;
}
var paramObj = {};
var decode = decodeURIComponent(str); // 先解码
var parsePart = decode.split("?#")[decode.split("?#").length-1]; // 截断不需要部分
var paramArr = parsePart.split("&");
for(var i = 0; i < paramArr.length; i++){
var tmp = paramArr[i].split("=");
var key = tmp[0];
var value = tmp[1] || true; // console.log("关键字是:" + key, "值是:" + value);
if(typeof paramObj[key] === "undefined"){
paramObj[key] = value;
}else{
var newValue = paramObj[key] + "," + value; // 有多个重复的先连接字符串,然后才分割开
paramObj[key] = newValue.split(",");
}
}
// console.log(paramObj);
}

URLSearchParams 接口定义处理 URL 参数串的更多相关文章

  1. URLSearchParams接口用来处理浏览器的url

    URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串. URLSearchParams.append()插入一个指定的键/值对作为新的搜索参数. URLSearchPa ...

  2. URLSearchParams 接口

    URLSearchParams 接口定义了很多个用来处理 URL 参数串的方法 他可以把对象转变成url上面查询信息的写法,例如a=1&b=2 可以把请求路由中的字符串   key=1 ,拼接 ...

  3. C语言定义从URL中获取键值的接口

    环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字). 头文件 /* 这是一份关于从Http请求信息中提取键值的接口声明的头文件 */ #ifndef _HEAD_H_ # ...

  4. 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容。提示(可以了解python的urllib模块)

    定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容.提示(可以了解python的urllib模块) import urllib.request def get_ ...

  5. Thymeleaf 之 内置对象、定义变量、URL参数及标签自定义属性

    Thymeleaf 之 内置对象.定义变量.URL参数及标签自定义属性 本文章来自[知识林] 如标题所述,这篇文章主要讲述Thymeleaf中的内置对象(list解析.日期格式化.数字格式化等).定义 ...

  6. 使用jquery获取url及url参数的方法及定义JQuery扩展方法

    1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javascript的基础的window对象,并没有用jquery的知识. 2.jquery获取 ...

  7. [开发笔记]-使用jquery获取url及url参数的方法

    使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javasc ...

  8. 使用jquery获取url及url参数的方法

    使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javasc ...

  9. CDN页面刷新接口定义[高升]

    一 . 任务 分发 工作流程步骤 1. 合作方按照高升定义的 json 数据格式向高升分发接口 post 任务,高升分发接口会根据接收情况即时反馈接收成功还是失败的结果.二 . 高升 分发 接口 定义 ...

随机推荐

  1. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  2. [转]Handler学习笔记(二)

    一.一个问题 有这样一个问题值得我们思考,若把一些类似于下载的功能(既耗时且不一定有结果)写在Activity(主线程)里,会导致Activity阻塞,长时间无响应,直至页面假死(如果5秒钟还没有完成 ...

  3. MySQL 源代码scr.rpm安装的一点注意事项

    rpm安装包通常为二进制包(Binary)以及源代码包(Source)两种形式. 在使用源代码方式安装MySQL的时候,官方站点上下载的源代码包通常为scr.rpm格式,而不是直接的tar包.对此,须 ...

  4. WPF教程六:布局之Grid面板

    Grid:网格面板 Grid顾名思义就是“网格”,以表格形式布局元素,对于整个面板上的元素进行布局,它的子控件被放在一个一个事先定义好的小格子里面,整齐配列. Grid和其他各个Panel比较起来,功 ...

  5. 记录日志框架:log4net使用

    一.log4net简介 Log4net是Apache下一个开放源码的项目,我们可以控制日志信息的输出目的地.Log4net中定义了多种日志信息输出模式.在做项目的时候最头疼的是在程序发布到正式环境之后 ...

  6. cs108 04 oop design

    oop design 分为以下几个方面: - encapsulation and modularity(封装和模块化) - API/Client interface design(API 接口给调用类 ...

  7. Spring 4 官方文档学习(十一)Web MVC 框架之URI Builder

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-uri-building ...

  8. C++ 类的隐式转换

    所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话. 这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象. 下面的代码,类Person ...

  9. 视差滚动(Parallax Scrolling)插件补充

    13. Windows Windows (github) 是一个让你用占据整个屏幕的section来构建单面网站的插件.该插件提供给你一些回调函数,当新的section出现在可视区并且并且处理快照时被 ...

  10. 【Java 线程的深入研究1】Java 提供了三种创建线程的方法

    Java 提供了三种创建线程的方法: 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 1.通过实现 Runnable 接口来 ...