本文同步自我的个人博客:http://www.52cik.com/2015/11/02/split-skill.html

通过js获取 QueryString (location.search部分) 参数很常见,网上代码也满天飞。

不过现在的框架,基本上都通过路由伪静态了,把以前的 QueryString 变成了 pathname (location.pathname部分) 路径参数了。

例如:/index.html?id=22&name=abc。

现在很多框架都是渲染为 /index/id/22/name/abc.html。

那么怎么获取 pathname 级的参数呢?有人觉得改下 QueryString 代码的正则即可。

虽然可以,但是比较麻烦,但是正则写的不严谨,可能匹配不精确,导致有些参数匹配不到。

其实无论是 QueryString,pathname,用正则都不是最合理的,而应该采取 split 大法。

为什么这么说呢,我举个例子,大家就会明白了。

例如 /index.html?id=22&name=abc&DEBUG

例如 /index/id/22/name/ab.cd?DEBUG

正则都很难处理这的情况,QueryString 到还好,pathname 的,就纠结的要死了。

这种情况,我们就应该祭出 split 大法来处理这些烦人的问题了。

由于 split 无论是否分割成功,都会返回数组,所以最合适处理这样的问题。

/**
* 获取 QueryString
* @param {string} [name] 参数名,可空
* @param {string} [search] search部分值,可空
* @return {string|object} 值或整个对象
*/
function getQueryString(name, search) {
var url = search || location.search;
var params = {}; if (url.indexOf("?") != -1) {
var arr = url.substr(1).split("&"); // 分割参数
for(var i = 0, l = arr.length; i < l; i ++) { // 遍历参数
var kv = arr[i].split("="); // 分隔键值对
params[kv[0]] = kv[1] && unescape(kv[1]); // 如果有值就解码存储
}
} return name ? params[name] : params; // 输出name的值或整个参数对象
} // 假设 search 值为 ?id=22&name=abc&DEBUG
console.log( getQueryString() ); // {id: "22", name: "abc", DEBUG: undefined}
console.log( getQueryString("name") ); // abc console.log( getQueryString("name", "?id=22&name=abc&DEBUG") ); // abc
/**
* 获取 pathname
* @param {string} [name] 参数名,可空
* @param {string} [path] pathname部分值,可空
* @return {string|object} 值或整个对象
*/
function getPathNmae(name, path) {
var params = {};
path = (path || location.pathname)
.split(".html")[0] // 获取 .html 之前的部分
.split("/"); // 分隔目录 while (path.length) { // 从后遍历数组
var val = path.pop(); // 得到值
var key = path.pop(); // 得到键 if (key) {
params[key] = unescape(val); // 解码存储
}
} return name ? params[name] : params; // 输出name的值或整个参数对象
} // 假设 pathname 值为 /index/id/22/name/abc.html
console.log( getPathNmae() ); // {id: "22", name: "abc"}
console.log( getPathNmae("name") ); // abc console.log( getPathNmae("name", "/index/id/22/name/abc.html") ); // abc

这样,简单又精确,而且兼容性比网上那些满天飞的代码要好。

split 方法的正确使用姿势的更多相关文章

  1. Js中split()方法的正确使用

    通过 js 获取 QueryString (location.search部分) 参数很常见,网上代码也满天飞.不过现在的框架,基本上都通过路由伪静态了,把以前的 QueryString 变成了pat ...

  2. xpath轴的正确使用姿势

    网上看了许多关于轴的介绍,只介绍了语法,而没有明说具体实际中该怎么使用,百思不得其解. 背景--python中使用xpath:  ----------------------------------- ...

  3. String.split()方法你可能不知道的一面

    一.问题 java中String的split()是我们经常使用的方法,用来按照特定字符分割字符串,那么我们看以下一段代码: public void splitTest() { String str = ...

  4. java String.split方法是用注意点(转)

    转自:http://www.blogjava.net/fanyingjie/archive/2010/08/05/328059.html 在java.lang包中有String.split()方法,返 ...

  5. NSnotificationCenter 正确使用姿势, removeObject 探索

    最近在做平板的过程中,发现了一些很不规范的代码.偶然修复支付bug的时候,看到其他项目代码,使用通知的地方没有移除,我以为我这个模块的支付闪退是因为他通知没有移除的缘故.而在debug和看了具体的代码 ...

  6. 微信H5中静默登录及非静默登录的正确使用姿势

    在微信中打开网页且需要调用微信登录接口时,微信官方给我们提供了两种登录调用方式:静默登录和非静默登录:但是官方文档中却没有说明在何种情况下使用静默登录,何种情况下使用非静默登录,所以在这里,我想将之前 ...

  7. Java日志正确使用姿势

    前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中“尽情”的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的bug发生,作为一名 ...

  8. 关于splice()方法,slice() 、split()方法讲解,reverse()方法、replace()方法

    1.slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规定从数组 ...

  9. String split方法与Guava Splitter用法区别

    String split方法与Guava Splitter用法区别 今天同事写了一段使用String split方法的代码,如下所示,同事期望得到的是字符"1",但是没想到却得到空 ...

随机推荐

  1. Effective Java 34 Emulate extensible enums with interfaces

    Advantage Disadvantage Enum types Clarity Safety Ease of maintenance. None extensibility Typesafe en ...

  2. Java 8 LongAdders:管理并发计数器的正确方式

    转自:http://www.importnew.com/11345.html 我只是喜欢新鲜的事物,而Java 8 有很多新东西.这次我想讨论其中我最喜欢的之一:并发加法器.这是一个新的类集合,他们用 ...

  3. Docker容器操作

    启动一次容器并执行命令(执行完命令后结束): docker run centos cat /etc/redhat-release 启动容器进入交互模式: docker run -i -t centos ...

  4. 使用Spring整合Hibernate,并实现对数据表的增、删、改、查的功能

    1.1 问题 使用Spring整合Hibernate,并实现资费表的增.删.改.查. 1.2 方案 Spring整合Hibernate的步骤: 1.3 步骤 实现此案例需要按照如下步骤进行. 采用的环 ...

  5. hdu 3367 Pseudoforest(最大生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  6. Python的逻辑运算符and小析

    近期突然对验证码的识别感兴趣了,然后就研究了一些图像识别和处理的资料,其中有一种图像处理是关于字体的细化和骨架提取的,但是这种算法没有现成的java代码实现,那些号称的java版代码多半都是效果很差或 ...

  7. LESSON THREE

    安装redis,并使用ruby进行简单测试.             使用redis客户端ruby测试 安装gem yum install rubygems  安装ruby所需的redis-rb程序库 ...

  8. hdu1042 N!

    /* N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...

  9. 【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)

    对于数据的存储,Android 提供了4种保存方式. (1)SharedPreference 此方法适用于简单数据的保持,文如其名,属于配置性质的保存,不适合比较大的情况,默认存放在手机内存里 (2) ...

  10. iOS使用Core Graphics和UIBezierPath绘画

    通过UIView的子类的- (void)drawRect:(CGRect)rect 函数可用对视图进行重新绘画: 要重新绘画可以通过Core Graphics和UIBezierPath来实现. 1.通 ...