zoukankan      html  css  js  c++  java
  • javascript数组操作

    1. 去重

    2. 删除指定元素

    3. 取最大值

    去重

    - 最简单的方法:对比法

    思路:先定义一个新的空数组,然后遍历要去重的数组,判断新数组的每个元素和要去重数组中的每个元素是否相等,将不相等的值添加到新数组中.

    代码:

    console.time('arr');
    	var removal = function(oldArr){
    		var newArr = [];  							//定义一个新数组
    		for (var i = 0; i < oldArr.length; i++) {	//循环要去重的数组
    			if(!isHasThisArr(newArr,oldArr[i])){	//判断新数组的每个元素和要去重数组中的每个元素是否相等[注意:一定要使用全等号,否则数组元素会进行隐式转换,导致字符串和数字一样的情况下被去重掉]
    				newArr.push(oldArr[i]);				//将不相等的值添加到新数组中
    			}
    		}
    		return newArr;
    	}
    
    	var isHasThisArr  = function(newArr,oldArr){
    		for (var i = 0; i < newArr.length; i++) {
    			if(newArr[i]===oldArr){
    				return true;
    			}
    		}
    		return false;
    	}
    
    	var arrNum = [1,2,1,'2',1,3,4,3,2,1,5,6,5,4,5,6,7,8,9,0,8,6,6,5,'5',4,4,3];
    	var removalArr = removal(arrNum);
    	console.log(removalArr);    //[1, 2, "2", 3, 4, 5, 6, 7, 8, 9, 0, "5"]
    console.timeEnd('arr');    //耗时:4.85302734375ms
    		 	    
    

    或者

    console.time('arr');
    	Array.prototype.removal = function(){
    		if(this.length==0){
    			return;
    		}
    		var newArr = [this[0]];							//创建新数组,并将要去重数组的第一个元素作为值
    		for (var i = 0; i < this.length; i++) {			//循环要去重的数组
    			var isBoolean = false;						//声明一个值为false的变量
    			for (var j = 0; j < newArr.length; j++) {	//循环新数组
    				if(newArr[j]===this[i]){				//判断新数组的每个元素和要去重数组中的每个元素是否相等[注意:一定要使用全等号,否则数组元素会进行隐式转换,导致字符串和数字一样的情况下被去重掉]
    					isBoolean = true;					//重置变量值为true
    					break;								//跳出新数组的循环
    				}
    			}
    			if(!isBoolean){								
    				newArr.push(this[i]);					//将不相等的值添加到新数组中 
    			}
    		}
    		return newArr;
    	}
    
    	var arrStr = [1,'1',2,'2',1,2,1,3,4,3,2,1,5,6,5,4,5,6,7,8,9,0,8,6,6,5,5,4,4,3,'a','2','3','a'];
    	var removalStrArr = arrStr.removal();
    	console.log(removalStrArr);    //[1, "1", 2, "2", 3, 4, 5, 6, 7, 8, 9, 0, "a", "3"]
    console.timeEnd('arr');    //耗时0.56689453125ms
    

    - 存在兼容性的方法:indexOf方法

    思路:定义一个新的空数组,利用indexOf的给定元素不存在返回-1的特性进行遍历去重

    注意:indexOf 不兼容IE8及以下

    代码:

    console.time('indexOf');
    	//利用数组的indexOf方法
    	Array.prototype.removalArray = function(){
    		var newArr = [];
    		for (var i = 0; i < this.length; i++) {
    			if(newArr.indexOf(this[i]) == -1){  //indexOf 不兼容IE8及以下 
    				newArr.push(this[i]);
    			}
    		}
    		return newArr;
    	}
    
    	var a = [1,2,1,2,3,'3',4,5,6,6,6];
    	var b = a.removalArray();
    	console.log(b);    //[1, 2, 3, "3", 4, 5, 6]
    console.timeEnd('indexOf');    //耗时:0.43310546875ms
    

    - 空间换时间法:hash法

    思路:创建新数组和新对象,判断以数组索引为属性的属性是否存在,如果不存在将该属性赋值为true,然后把该元素之添加到新数组中

    注意:利用hash表,可能会出现字符串和数字一样时出错的问题(不区分数据类型),如var a = [1, 2, 3, 4, '3', 5],会返回[1, 2, 3, 4, 5]

    代码:

    console.time('removalObj');
    	//利用hash表,可能会出现字符串和数字一样的话出错,如var a = [1, 2, 3, 4, '3', 5],会返回[1, 2, 3, 4, 5]
    	Array.prototype.removalObj = function(){
    		var newArr = [];
    		var ObjArr = {};
    		for (var i = 0; i < this.length; i++) {
    			if(!ObjArr[this[i]]){
    				ObjArr[this[i]] = true;
    				newArr.push(this[i]);
    			}
    		}
    		return newArr;
    	}
    
    	var objArray = [1,2,1,2,3,'3',4,5,6,6,6];
    	var removalObjArray = objArray.removalObj();
    	console.log(removalObjArray);    //[1, 2, 3, 4, 5, 6]
    console.timeEnd('removalObj');    //耗时:0.873046875ms
    

    删除指定元素

    思路:利用数组splice方法的特性,获取传入值的元素下标,然后从该下标开始删除,到该下标之后的第一个元素结束删除

    //删除指定元素
    Array.prototype.remove = function(val){
    	for (var i = 0; i < this.length; i++) {
    		if(this[i] === val){
    			this.splice(i,1);
    			break;
    		}
    	}
    	return this;
    }
    
    var re = [1,2,3,4,5,'3','6'];
    var res = re.remove('3');
    console.log(res);    //[1, 2, 3, 4, 5, "6"]
    

    取最大值

    思路:先声明一个变量,值为数组的第一个元素,然后拿声明好的变量和数组中的元素循环对比,发现数组中的元素比变量的值大就把该值赋给变量

    代码:

    //取最大值
    Array.prototype.max = function(){
    	var max = this[0];
    	for (var i = 0; i < this.length; i++) {
    		if(this[i] > max){
    			max = this[i];
    		}
    	}
    	return max;
    }
    
    var arrMax = [1,2,2,3,,6,7,89,9,5,5,3,21];
    console.log(arrMax.max());    //89
    
  • 相关阅读:
    【POJ1456】Supermarket(贪心)
    【HDU5831】Rikka with Parenthesis II(括号)
    【ZOJ2278】Fight for Food(dp)
    【ZOJ2277】The Gate to Freedom
    【ZOJ2276】Lara Croft(bfs)
    3944: Sum[杜教筛]
    [Sdoi2016]平凡的骰子
    [Sdoi2016]齿轮
    [Sdoi2016]硬币游戏
    [NOI2005]月下柠檬树[计算几何(simpson)]
  • 原文地址:https://www.cnblogs.com/wyangnb/p/8296910.html
Copyright © 2011-2022 走看看