理解js动态精髓之数组操作
/**一下我会用多种方法完成数组去重,去空************************************
*对于一个普通的数组,用任何一门语言都能很容易的完成去重去空,但是js的动态性,赋予了数组更灵活的魂魄。
*首先请看。
*如下例子:将字符串var testStr = '1,23,,3,3,3,,,1,2,2,23,';转为数组去重去空。
***************************************************************************/
var testStr = '1,23,,3,3,3,,,1,2,2,23,';
var testArr = testStr.split(/,|,/);
//如果js开发经验少的人可能,或者静态编译语言开发的人想到的可能会想到如下解决方法。
var tempArr = new Array();
for( var i = 0, l = testArr.length; i < l; i ++ ) {
if( !!testArr[i] ) {
tempArr.push(testArr[i]);
}
}
alert(tempArr);
//思路很简单,两个数组。
//但是js的使命是一个数组解决问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
//方法一
var i = 0;
var l = testArr.length;
while( i < l ) {
if( !testArr[i] ) {
testArr.splice(i, 1);
l --;
continue;
}
i ++;
}
alert(testArr);
//总结:方法一从前往后遍历,遇到空的删之。因为js的数组动态变化,l--,splice是数组的一个方法。
//方法二
var l = testArr.length;
while( --l > 0 ) {
if( !testArr[l] || testArr[l] == '' ) {
testArr.splice(l, 1);
}
}
alert(testArr);
//总结:方法二是从后往前遍历,遇到空的删之。始终牢记。js的数组的长度是可以改变的。如果testArr.length = 0,即将数组置空。
//受到上面的方法的启示后,去重的原理也差不多了。
//注:::::::::::是在上面去空的基础上哈。
var l = testArr.length;
while( --l ) {
for( var i =0; i < l; i++ ) {
if( testArr[l] = testArr[i] ) {
testArr.splice(l, 1);
break;
}
}
}
//总结:还是数组的动态性,双重循环,比较,重复删之。时间复杂度是n*(n-1)。当然可能还有更好的方法。
//以上的代码为近期优化代码过程中的感想,肯定还有更多更好的方法。希望有感想的你留下你宝贵的代码。