去重
- 最简单的方法:对比法
思路:先定义一个新的空数组,然后遍历要去重的数组,判断新数组的每个元素和要去重数组中的每个元素是否相等,将不相等的值添加到新数组中.
代码:
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