JavaScript中split与join函数的进阶使用技巧


Posted in Javascript onMay 03, 2016

Javascript拥有两个相当强大而且受开发者喜爱的函数:split 与join 俩对立的函数。这俩函数能让string与array两种类型互换,也就是数组能被序列化为字符串,反之亦然。我们能把这俩函数发挥得淋漓尽致。下面就来探索里面的一些有趣的应用, 首先介绍一下这两个函数:

String.prototype.split(separator, limit)
separator把字符串分割为数组,可选参数limit定义了生成数组的最大length。

"85@@86@@53".split('@@'); //['85','86','53'];
"banana".split(); //["banana"]; //( thanks peter (-: )
"president,senate,house".split(',',2); //["president", "senate"]
Array.prototype.join(separator)

可选参数separator把数组转换为一个字符串。如果不提供separator,那么就会把逗号做为这个参数值(就跟数组的toString函数一样)。

["slugs","snails","puppy dog's tails"].join(' and '); //"slugs and snails and puppy dog's tails"
['Giants', 4, 'Rangers', 1].join(' '); //"Giants 4 Rangers 1"
[1962,1989,2002,2010].join();

下面来看这些应用:

replaceAll
这个简单的函数不像原生的replace函数,它能作为一个全局的子字符串替换而不需要使用正则表达式。

String.prototype.replaceAll = function(find, replaceWith) {
  return this.split(find).join(replaceWith); 
}

"the man and the plan".replaceAll('the','a'); //"a man and a plan"

对于小的字符串,它比单个字符替换的原生函数性能要弱一些(这里指的是正则表达式的两个额外的函数),但是在mozilla下,如果这个字符超过2个或3个字符话,这种使用函数要比正则表达式运行得更快。

occurences
该函数能取到子字符串匹配的个数。而且这种函数很直接不需要正则。

String.prototype.occurences = function(find, matchCase) {
  var text = this;
  matchCase || (find = find.toLowerCase(), text = text.toLowerCase());
  return text.split(find).length-1;  
}

document.body.innerHTML.occurences("div"); //google home page has 114
document.body.innerHTML.occurences("/div"); //google home page has 57
"England engages its engineers".occurrences("eng",true); //2
repeat

该函数是从prototype.js 借鉴而来:

String.prototype.repeat = function(times) {
  return new Array(times+1).join(this);  
}

"go ".repeat(3) + "Giants!"; //"go go go Giants!"

它的美妙之处就在于join函数的使用。焦点就在这个separator参数值,然后这个基础数组仅仅包含了一些未定义的value值。为了更清楚的说明这点,我们来重造一下上面的实例:

[undefined,undefined,undefined,undefined].join("go ") + "Giants

记住在join之前每个数组元素都会转换为一个字符串(这里就是一个空字符串)。这个repeat函数的应用是通过数组字面量定义数组的为数不多的不可行的应用。

使用limit参数
我很少使用split函数的limit可选参数,下面介绍一个使用这个limit的实例:

var getDomain = function(url) {
  return url.split('/',3).join('/');
}

getDomain("http://www.aneventapart.com/2010/seattle/slides/");
//"http://www.aneventapart.com"
getDomain("https://addons.mozilla.org/en-US/firefox/bookmarks/");
//"https://addons.mozilla.org"

修改数值成员
如果我们将正则混合起来使用,join,split就能很容易的修改数组成员了。但是这个函数也没有想象的难,它的主要功能是去掉给定数组的每个member前面指定的字符串。

var beheadMembers = function(arr, removeStr) {
  var regex = RegExp("[,]?" + removeStr);
  return arr.join().split(regex).slice(1);
}

//make an array containing only the numeric portion of flight numbers
beheadMembers(["ba015","ba129","ba130"],"ba"); //["015","129","130"]

不幸的是,这种函数在IE中失效,因为他们从split中错误的去掉了第一个空成员。现在来修正这种函数:

var beheadMembers = function(arr, removeStr) {
  var regex = RegExp("[,]?" + removeStr);
  var result = arr.join().split(regex);
  return result[0] && result || result.slice(1); //IE workaround
}

我们为什么要用这个技巧而不用Emascript 5 中array 的map函数呢?

["ba015","ba129","ba130"].map(function(e) {
  return e.replace('ba','')
}); //["015","129","130"]

在实际的运用中,在可行的时候,我通常使用原生的map函数(在IE<9 以下不可用)。下面的例子仅仅作为学习的工具,但是值得注意的是,join与split的调用语法更简洁更直接一些。最有趣的是,它也非常高效,尤其是对于很小的数组,在FF与Safari中它表现为更为高效。对于大数组来说,map函数就更合适一些。(在所有的浏览器中),join与split函数的函数调用会少一些。

//test 1 - using join/split
var arr = [], x = 1000;
while (x--) {arr.push("ba" + x);}

var beheadMembers = function(arr, regex) {
  return arr.join().split(regex).slice(1);
}

var regex = RegExp("[,]?" + 'ba');
var timer = +new Date, y = 1000;
while(y--) {beheadMembers(arr,regex);};
+new Date - timer;

//FF 3.6 733ms
//Ch 7  464ms
//Sa 5  701ms
//IE 8 1256ms

//test 2 - using native map function
var arr = [], x = 1000;
while (x--) {arr.push("ba" + x);}

var timer = +new Date, y = 1000;
while(y--) {
  arr.map(function(e) {
    return e.replace('ba','')
  });
}
+new Date - timer;

//FF 3.6 2051ms
//Cr 7  732ms
//Sf 5  1520ms
//IE 8  (Not supported)

模式匹配
数组需要不断的去执行模式匹配,但是字符串不会。正则表达式能在字符串中运用,但是在数组中不会。把数组转为字符串用于模式匹配的强悍之处远远超越这篇文章讲述的范围。让我们来看看它的一个简单应用。

假设竞走的比赛结果需要保存到数组中。目的就是将竞赛者与他们的记录时间交替的放在数组中。我们可以用join与正则表达式来验证这种存储模式是否正确。下面的代码就是通过查找两个连续的名字来找出记录时间被漏掉的情况。

var results = ['sunil', '23:09', 'bob', '22:09', 'carlos', 'mary', '22:59'];
var badData = results.join(',').match(/[a-zA-Z]+,[a-zA-Z]+/g);
badData; //["carlos,mary"]
Javascript 相关文章推荐
扩展String功能方法
Sep 22 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 Javascript
JavaScript获取onclick、onchange等事件值的代码
Jul 22 Javascript
js的匿名函数使用介绍
Dec 11 Javascript
js通过八个点 拖动改变div大小的实现方法
Mar 05 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
javascript时间差插件分享
Jul 18 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
利用百度地图API获取当前位置信息的实例
Nov 06 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
JavaScript实现页面动态验证码的实现示例
Mar 23 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 #Javascript
深入解析jQuery中Deferred的deferred.promise()方法
May 03 #Javascript
浅析函数声明和函数表达式——函数声明的声明提前
May 03 #Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 #Javascript
jQuery的promise与deferred对象在异步回调中的作用
May 03 #Javascript
JavaScript的MVVM库Vue.js入门学习笔记
May 03 #Javascript
聊一聊JavaScript作用域和作用域链
May 03 #Javascript
You might like
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
jQuery的强大选择器小结
2009/12/27 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
用Python进行TCP网络编程的教程
2015/04/29 Python
python3大文件解压和基本操作
2017/12/15 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
小学端午节活动方案
2014/03/13 职场文书
培训心得体会怎么写
2016/01/25 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
Python基础详解之描述符
2021/04/28 Python
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
nginx配置限速限流基于内置模块
2022/05/02 Servers