【www.gdgbn.com--网页配色】

yahoo.util.yuiloader类的源码, 其中有个排除数组重复项的方法, 让我觉得甚为巧妙, 这里分享下…


一. yui中的源码

var toobject = function(a) {
      var o = {};
      for (var i=0, j=a.length; i       }
      return o;
};
var keys = function(o) {
      var a=[], i;
      for (i in o) {
           if (o.hasownproperty(i)) { // 这里, yui源码中是lang.hasownproperty(o, i)
               a.push(i);
           }
      }
      return a;
};
var uniq = function(a) {
      return keys(toobject(a));
};

 

 

  二. 该方法的思路
1. 先以目标数组的值为key生成一个对象. 这一步是最核心的: 因为在一个对象中, key是无法重复的, 这样就很巧妙的排除了重复值;

 

 

2. 遍历生成的对象, 将这些key取出来放到一个数组中, ok, 到此就大功告成了!(简单吧, 只需两步就行)

三. 该方法的特点
1. 对于该方法, 不论数组有多少项, 都只会遍历两次, 在性能上的优势较明显(想想自己以前的做法: 对数组项进行逐个对比, 其性能之差, 可想而知).

2. 经我的测试, 该方法只适用于数组项为字符串, 数字的一维数组(我觉得, 对多维数组进行排除重复项的操作, 实在是太杯具了!).

var toobject = function(a) {
var o = {};
for (var i=0, j=a.length; i o[a[i]] = toobject(a[i]) ;
} else {
o[a[i]] = true;
}
}
return o;
};
var keys = function(o) {
var a=[], i;
for (i in o) {
if (o.hasownproperty(i) && typeof o[i] === "object") { // 这里, yui源码中是lang.hasownproperty(o, i)
a.push(keys(o[i])) ;
} else {
a.push(i);
}
}
return a;
};
var uniq = function(a) {
return keys(toobject(a));
};

方法二

var uniq = function (arr) {
var a = [],
o = {},
p,
v,
len = arr.length;
if (len < 2) {
return arr;
}
for (p in arr) {
v = arr[p];
if (1 !== o[v]) {
a.push(p);
o[v] = 1;
}
}
return a;
}

没有最好,只有最合适的方式,其实使用 array.indexof() 的思路也是不错的选择,对于已经支持的浏览器直接用原生的 array.indexof() 方法,对于未支持的,我们增加 array.indexof() 方法,如下:

if(!array.prototype.indexof) {
 array.prototype.indexof = function (obj, fromindex) {
 if (fromindex == null) {           
 fromindex = 0;       
 } else if (fromindex < 0) {           
 fromindex = math.max(0, this.length + fromindex);       
 }       
 for (var i = fromindex; i < this.length; i++) {           
 if (this[i] === obj)               
 return i;           
 }       
 return -1;  
  };
  }

接下来,实现的过程就非常简单了。

对于使用 array.indexof() 方法实现方案的优化提示:找到相同值时,从数组中移除,以减少下次遍历的量。

本文来源:http://www.gdgbn.com/wangyezhizuo/28144/