split用循环实现它的功能(非直接使用split)
解析:
split的作用就是把字符串通过指定的字符分割开来,然后组成数组
官方点的说法:split() 方法用于把一个字符串分割成字符串数组。
我们这里用循环实现split的功能,但是不涉及可选参数那一条,即:指定返回的数组的最大长度。
思路分析:
由split的方法我们可以知道,我们应该把一个字符串分割以后存储在数组里面,在这里我们的理想状态是一个分隔符。但是实际情况我们需要考虑多个分隔符。
我把单个分隔符和多个分隔符的代码都贴上去,我相信大家就都明白了。
单个分隔符
var str = '香蕉,苹果,梨子,枇杷';
String.prototype.split = function (sep) {
var arr = [];
var temp = '';
for(var i = 0 ; i<this.length;i++){
if (this[i]==sep) {
arr[arr.length]=temp;
temp='';
continue;
}
temp+= this[i];
}
arr[arr.length] =temp;
return arr;
}
console.log(str.split(','));
在这里简单的说一下单个字符分割的流程,在String的原型中插入一个方法,传入的实参是分割的符号,先循环出每个字符,然后判断循环出来的字符是否是分隔符,如果是,就把后面累加的字符存储到数组里面,然后置空。(如果不置空,就会一直累加下去,就不是我们想要的结果)。最后是continue(结束本次的语句,如果不结束就会执行下面的累加操作,就会导致分隔符放到数组里面去)。最后注意一点:arr[arr.length] =temp;
必须要添加这一条语句,因为如果不添加最后一个字符,例子中的枇杷就不会显示出来。(因为在执行完成最后一次for循环以后就没有再执行if里面的判断了,temp里面的字符也不会放到数组里面)。
多个分隔符
多个分隔符有一点复杂,我还是先上代码把。(说明一点,代码只考虑了多个分隔符的情况,里面缺少了如果实参传入没有字符串的判断等语句,请无视)
var str = '香蕉,,苹果,,梨子,,枇杷';
String.prototype.split = function (separator) {
var arr = [];
var temp = '';
var sep = '';
for(var i=0; i < this.length;){
// 如果是分隔符就把temp放到数组里面
// 考虑分隔符是多个字符的情况
sep = this[i];//初始化
for(var j=1; j < separator.length; j++){//本来就+1所以j是1
sep += this[i+j];
}//出来地sep就是两个分隔符;
// 找到了分隔符要做的事情
if(sep == separator){
// console.log(arr.length);
arr[arr.length] = temp;
temp = '';
i += separator.length;//因为分隔符是两个所以是+2【之所以用length是因为要考虑多个地情况】
continue;
}
// 修改循环的判断条件
temp += this[i++];//是正常情况下地时候就是+1 【非多个分隔符的时候】
// i++;
}
// 最后这个temp也要放到数组里面
arr[arr.length] = temp;
return arr;
}
console.log(str.split(',,'));//[]
多个字符的情况下,大体和单个字符差不多,但是需要注意的一点是,我们应该如何判断分割符的个数,在这里我们用一个嵌套在外循环里面的内循环for循环来判断分隔符的个数,在这里的j=1,举个例子,【香蕉,,】下标分别为0123,这里假如是2号位置的分隔符,进入循环就是this[2+1]=this[3],三号位还是分隔符,然后sep就是两个分隔符,随即跳出循环。如果这里j=0;就会多循环一次到达苹这个字上面,就出错了。sep = this[i];
这里是初始化this[i]如果不初始化就会和之前的累加。所以让j=0然后注释掉这段代码是行不通的。
多个字符的时候还有一点必须说明的是,第一个for循环里面的i++被替换到了下面,第一个是在if判断语句里面,在里面因为分隔符是两个,当遇到两个分隔符的时候判断条件应该是跳过这两个分隔符,所以是加上分隔符的长度。
第二个在temp += this[i++];
里面这里是没有遇到分割符的时候每个字符都会遍历所以是加1