- 请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。
解析:方法一:我的想法是arr指向原数组,然后再复制arr数组得到newarr这个是用来最终返回的。让原数组的每一项(外循环)去对比newarr中每一项(内循环),若第一次找到相同的则k++,下次再遇到相同的即k>1时立即删除该项。这里k起的是计数的作用,还是挺重要的,每次新的元素比较时清零k。
1 Array.prototype.removeRepeat=function(){ 2 var arr=this; 3 var newarr= arr.slice(0),k; 4 for(var j=0;j<arr.length;j++){ 5 k=0; 6 for(var i=0;i<newarr.length;i++){ 7 if(arr[j]==newarr[i]){ 8 k++; 9 if(k>1){ 10 newarr.splice(i,1); 11 } 12 } 13 } 14 15 } 16 return newarr; 17 }
方法二:对数组一排序,这样就按数字一样的在一起了。例如var a=[4,6,35,65,35,9,6],a.sort()后a变为[35, 35, 4, 6, 6, 65, 9],然后依次循环搞定,只判断相邻两元素是否相等
1 Array.prototype.rem=function(){ 2 var a=this; 3 a=a.sort(); 4 for(var i=1;i<a.length;){ 5 if(a[i]==a[i-1]){ a.splice(i,1);i=i;} 6 else{i++} 7 } 8 return a; 9 }
好吧我貌似题没看清,要求返回包含被删除的重复条目的数组:push要放在删除之前
1 Array.prototype.rem=function(){ 2 var a=this,b=[]; 3 a=a.sort(); 4 for(var i=1;i<a.length;){ 5 if(a[i]==a[i-1]){ b.push(a[i]);a.splice(i,1);} 6 else{i++} 7 } 8 return b; 9 }
方法三:最近在整理正则方面的知识,突然想到通过正则匹配也可以完成该题目,但是效率慢下来了,因为每次都会从头开始正则匹配,正则表达式还需得优化一下。
Array.prototype.remove=function(){
//将数组转化成用空格间隔的字符串 var str=this.join(' '),re;
//以空格为边界匹配,捕获组$2为重复的元素,如:/((d+).*?)2/.exec('3 5 34 3 6');//["3 5 34 3", "3 5 34 ", "3"]
var p=/((d+).*?)2/; var arr=[]; while(1){
//终止循环匹配条件 if(str.search(p)!=-1){ re=str.replace(p,RegExp.$1.trim());//对捕获组$1去除两边空格($系列是RegExp构造函数上的属性),用处理后的不重复字符串替换匹配的项 arr.push(RegExp.$2); 将重复的元素送入数组。缺点是送入数组的元素可能会重复,如果需要可以再处理该数组。 str=re; }else{ break; } } console.log('被删除的',arr); return str.split(' '); }
- 请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示出来。
解析:在用arguments之前我先判断了下arguments是不是数组,Object.prototype.toString.call(arguments)结果输出 [object Arguments] 看来并不是数组,不过倒是可以用 Array.prototype.sort.call(arguments[0]) 来做该题,要注意如果调用函数 mySort(arr) 传入数组的话函数里要用arguments[0]
1 function mySort(){ 2 var tags=new Array(); 3 for(var i=0;i<arguments.length;i++){ 4 tags.push(arguments[i]); 5 } 6 tags.sort(function(x,y){ 7 if(x>y) return 1; 8 else if(x<y) return -1; 9 else return 0 10 }); 11 return tags; 12 }
1 function mySort(){ 2 Array.prototype.sort.call(arguments[0],function(x,y){ 3 if(x>y) return 1; 4 else if(x<y) return -1; 5 else return 0 6 }) 7 }