js对象有一个特性:
js中对象的key(属性名)是永远不会重复的!
js数组去重
方法一:
//将数组arr去掉重复的值
var arr = [3,1,5,1,23,5,11];
//1.把数组元素转换成对象属性
function toObject(arr){
var obj = {};
var j;
for(var i=0,j=arr.length;i<j;i++){
obj[arr[i]] = true; //利用js对象属性名不会重复的特性,将数组元素设置为对象属性
//console.log(obj);
}
return obj;
}
//2.把对象属性转换回新数组元素
function toArray(obj){
var arr = [];
for(var attr in obj){
if(obj.hasOwnProperty(attr)){
arr.push(attr);
}
}
return arr;
}
//去重函数
function uniq(arr){
return toArray(toObject(arr));
}
alert(uniq(arr));
以上时雅虎yui的一段源码,但是我测试的时候结果是[1,3,5,11,23],obj对象在设置属性的时候进行了自动排序,我暂时还不知道是什么原因。
方法二:
下面是网上查的一个方法,原理应该跟上面是一样的
var arr = [3,1,5,1,23,5,11];
function uniq(arr){
var obj = {}, newArr = []; //空对象和新数组
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]] = true;
newArr.push(arr[i]);
}
}
return newArr;
}
alert(uniq(arr)) //[3,1,5,23,11]
方法三:
利用indexOf() function uniq(arr){
var newArr = [];
for(var i=0;i<arr.length;i++){
if(newArr.indexOf(arr[i])==-1){ //js在执行indexOf方法时会遍历数组直到找到,会耗费很多时间
newArr.push(arr[i]);
}
}
return newArr;
}
alert(uniq(arr))
indexOf()效率并不高