当前位置: 首页 > 图文教程 > 网络编程 > Javascript > javascript 删除数组中重复项(uniq)

Javascript
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
JS Array对象入门分析
javascript typeof的用法与typeof运算符介绍[详细]
js CSS操作方法集合
让任务管理器中的CPU跳舞的js代码
ajax无刷新动态调用股票信息(改良版)
js Clip的奇思妙想之文字拼接效果
js Clip奇思妙想之多彩渐变字效果
JS 创建对象(常见的几种方法)
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
JS提交并解析后台返回的XML的代码
初学Javascript的一些总结
JS 继承实例分析
js form action动态修改方法
仿163填写邮件地址自动显示下拉(无优化)
js判断对象是否是某一类型
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
js 目录列举函数
js颜色选择器代码[firefox不支持]
js wmp操作代码小结(音乐连播功能)

Javascript 中的 javascript 删除数组中重复项(uniq)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-02-27   浏览: 447 ::
收藏到网摘: n/a

巧妙去除数组中的重复项的方法参考,需要的朋友可以参考下。 首先让我们看下 YUI 是如何处理的:
复制代码 代码如下:

var toObject = function(a) {
var o = {};
for (var i = 0; i < a.length; i = i+1) {
o[a[i]] = true;
}
return o;
};
var keys = function(o) {
var a=[], i;
for (i in o) {
if (lang.hasOwnProperty(o, i)) { // YUI的方法
a.push(i);
}
}
return a;
};
var uniq = function(a) {
return keys(toObject(a));
};

详细分析,见同事 长天 的分享 《巧妙去除数组中的重复项》。
自己使用的方式与 YUI 的方式十分相似,不过仅使用了一次循环便完成了删除数组中重复项,如下:
复制代码 代码如下:

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

经过了简单的测试:自己使用的方式性能远远高于 YUI 的方式。
抛砖引玉,欢迎大家提供更好的处理方法。
2009年12月28日更新:
以上两种函数方法暂时都不能处理复杂的含有混合类型的数组(感谢 小猫 提出的疑问),如:[0,"0",1,"1",0]、["null",null]。
对于能够约定类型为数字(注:要求非0开头的数字,小数除外)或字符串的数组,我们可以用改进后的函数方法(感谢 closurecache 提供的思路):
复制代码 代码如下:

var uniq = function (arr) {
var a = [],
o = {},
i,
v,
cv, // corrected value
len = arr.length;
if (len < 2) {
return arr;
}
for (i = 0; i < len; i++) {
v = arr[i];
/* closurecache 提供的函数中使用的是 cv = v + 0;,
* 这样就无法辨别类似[1, 10, "1", "10"]的数组,
* 因为运算后 => 1, 10, 10, 100,很明显,出现了重复的标示符。
* 加前面就难道没问题吗?
* 有的:数组中不能出现类似01 、001,以 0 开头的数字,
* 但适用性比原先更广。
*/
cv = 0 + v;
if (!o[cv]) {
a.push(v);
o[cv] = true;
}
}
return a;
}

如果大家想在此解题思路的基础上,更完美一点,推荐 Dexter.Yy 的方法,进行类型判断,给予唯一标示符,详见 评论 20 楼。
没有最好,只有最合适的方式,其实使用 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() 方法实现方案的优化提示:找到相同值时,从数组中移除,以减少下次遍历的量。