【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; io[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() 方法实现方案的优化提示:找到相同值时,从数组中移除,以减少下次遍历的量。