1、使用双重循环
优点:兼容性好
js javascript">js-function">js-keyword">function js-title">uniquejs-params">(arr){
js-keyword">var len=arr.length;
js-keyword">if(len<=js-number">1) js-keyword">return arr;
js-keyword">var newArr=[];
js-keyword">for(js-keyword">var i=js-number">0;i<len;i++){
js-keyword">for(js-keyword">var j=js-number">0;j<newArr.length;j++){
js-keyword">if(arr[i]===newArr[j]){
js-keyword">break;
}
}
js-comment">// 如果newArr中没有arr[i],则最后j===newArr.length
js-keyword">if(j===newArr.length){
newArr.push(arr[i]);
}
}
js-keyword">return newArr;
}
2、使用indexof
js matlab">js-function">js-keyword">function js-title">uniquejs-params">(arr){
js-keyword">if(js-transposed_variable">arr.js-built_in">length<=js-number">1) js-keyword">return arr;
var newArr=js-matrix">[];
js-keyword">for(var js-built_in">i=js-number">0;js-built_in">i<js-transposed_variable">arr.js-built_in">length;js-built_in">i++)js-cell">{
if(newArr.indexOf(arr[i])===-js-number">1)
newArr.push(arr[i]);
}
js-keyword">return newArr;
}
3、先排序再去重
排好序后,只要前后两个数据不相等,就把数据加入新数组
这种方法的效率要比第二种好。
js matlab">js-function">js-keyword">function js-title">uniquejs-params">(arr){
var len=js-transposed_variable">arr.js-built_in">length;
js-keyword">if(len<=js-number">1) js-keyword">return arr;
arr=js-transposed_variable">arr.sort();
var newArr=js-matrix">[arr[js-number">0]];
js-keyword">for(var js-built_in">i=js-number">1;js-built_in">i<len;js-built_in">i++)js-cell">{
if(arr[i-js-number">1]!==arr[i]){
newArr.push(arr[i]);
}
}
js-keyword">return newArr;
}
或者:
js php">js-function">js-keyword">function js-title">uniquejs-params">(arr){
js-keyword">var len=arr.length;
js-keyword">if(len<=js-number">1) js-keyword">return arr;
arr=arr.sort();
arr.js-keyword">forEach(js-function">js-keyword">functionjs-params">(item,index,arr){
js-keyword">if(item==arr[index+js-number">1]){
arr.splice(index,js-number">1);
}
});
js-keyword">return arr;
}
综合第2、3种方法,如果排好序则比较前后两个是否相等,如果没排好序,则使用indexOf进行判断
js javascript">js-function">js-keyword">function js-title">uniquejs-params">(arr,isSorted){
js-keyword">var len=arr.length;
js-keyword">if(len<=js-number">1) js-keyword">return arr;
js-keyword">var newArr=[arr[js-number">0]];
js-keyword">for(js-keyword">var i=js-number">1;i<len;i++){
js-keyword">if(isSorted){
js-keyword">if(arr[i-js-number">1]!==arr[i]){
newArr.push(arr[i]);
}
}js-keyword">else{
js-keyword">if(newArr.indexOf(arr[i])==-js-number">1){
newArr.push(arr[i]);
}
}
}
js-keyword">return newArr;
}
4、filter
利用indexOf返回的是第一次查找到相关元素的下标,如果元素重复,则遍历后边的元素时,不会将后边的元素返回。
js php">js-function">js-keyword">function js-title">uniquejs-params">(arr){
js-keyword">var len=arr.length;
js-keyword">if(len<=js-number">1) js-keyword">return arr;
js-keyword">var newArr=[];
newArr=arr.filter(js-function">js-keyword">functionjs-params">(item,index,array){
js-keyword">return js-keyword">array.indexOf(item)===index;
});
js-keyword">return newArr;
}
先排序:
js php">js-function">js-keyword">function js-title">uniquejs-params">(arr){
js-keyword">var len=arr.length;
js-keyword">if(len<=js-number">1) js-keyword">return arr;
js-keyword">var newArr=[];
newArr=arr.sort().filter(js-function">js-keyword">functionjs-params">(item,index,array){
js-keyword">return item!==js-keyword">array[index-js-number">1];
});
js-keyword">return newArr;
}
5、Object键值对
如果obj中由item这个键,则返回true,不会返回该item,不然就把item设为obj的键。
问题:由于object中所有的键都为字符串,所以1和‘1’是相等的。
js php">js-keyword">var js-keyword">array=[js-number">1,js-number">2,js-number">1,js-number">1,js-string">'1'];
js-function">js-keyword">function js-title">uniquejs-params">(array){
js-keyword">var obj={};
js-keyword">return js-keyword">array.filter(js-function">js-keyword">functionjs-params">(item,index,array){
js-keyword">return obj.hasOwnProperty(item)?js-keyword">false:(obj[item]=js-keyword">true);
});
}
console.log(unique(js-keyword">array));js-comment">//[1,2]
改进:
使用typeof item+item作为键,这样的话,1和‘1’对应的键分别为number1、string1,会被认为是不相等的
js php">js-keyword">var js-keyword">array=[js-number">1,js-number">2,js-number">1,js-number">1,js-string">'1'];
js-function">js-keyword">function js-title">uniquejs-params">(array){
js-keyword">var obj={};
js-keyword">return js-keyword">array.filter(js-function">js-keyword">functionjs-params">(item,index,array){
js-comment">//console.log(typeof item+item);//number1,number2,number1,number1,string1
js-keyword">return obj.hasOwnProperty(typeof item+item)?js-keyword">false:(obj[typeof item+item]=js-keyword">true);
});
}
console.log(unique(js-keyword">array));js-comment">//[1,2,'1']
ES6:
1、使用Set结构
js php">js-function">js-keyword">function js-title">uniquejs-params">(array){
js-keyword">return js-keyword">Array.from(js-keyword">new Set(js-keyword">array));
}
简化:
js php">js-function">js-keyword">function js-title">uniquejs-params">(array){
js-keyword">return [...js-keyword">new Set(js-keyword">array)];
}
再简化:
js lasso">js-built_in">var uniquejs-subst">=(js-built_in">array)js-subst">=>js-preprocessor">[js-attribute">...js-literal">new js-built_in">Set(js-built_in">array)js-preprocessor">]js-markup">;
2、使用Map结构
js coffeescript">js-reserved">function unique(arr){
js-reserved">var map=js-keyword">new Map();
js-keyword">return arr.filterjs-function">js-params">((item)=>!map.has(item)&&map.set(item,js-literal">true));
}
js-title">console.js-title">logjs-params">(unique([js-number">1,js-number">1,js-number">2,js-number">4,js-number">4]));
统计页面有多少种元素?
首先通过document.getElementsByTagName("*")
获得总共有多少种元素,再通过数组去重的方法去掉重复的元素。