js数组去重

时间:2010年08月03日作者:愚人码头查看次数:9,739 views评论次数:18

js数组去重就是把数组中重复的元素去掉:


Array.prototype.delRepeat=function(){
	var newArray=new Array();
	var len=this.length;
	for (var i=0;i<len ;i++){
		for(var j=i+1;j<len;j++){
			if(this[i]===this[j]){
				j=++i;
			}
		}
		newArray.push(this[i]);
	}
	return newArray;
}

但是很明显这里有for循环内嵌了另一个for循环,在大数据量下肯定非常耗时!效率低下!经过查找和高人指点优化了一个新方法:


Array.prototype.delRepeat=function(){
	var newArray=[];
	var provisionalTable = {};
	for (var i = 0, item; (item= this[i]) != null; i++) {
        if (!provisionalTable[item]) {
            newArray.push(item);
            provisionalTable[item] = true;
        }
    }
    return newArray;
}

就是使用一个临时的provisionalTable对象,将数组的值作为provisionalTable对象的键值,如果相应的值不存在就将这个数组的值push到新数组中。
效率是提高了,但是有个bug,就是假设数组中换用可转换的数字和字符串,比如数组[6,"6"]这时候就好被去掉一个。悲剧,同时求解决方法。

声明: 本文采用 BY-NC-SA 协议进行授权 | WEB前端开发
转载请注明转自《js数组去重

如果你读了我的文章,觉得有帮助: 说明
标签:,分类:JS
17条评论
  1. 路人留言于:2010年08月03日20:17

    Array.prototype.delRepeat=function(){
    var newArray= [];
    var tmpObj = {};
    var len=this.length;
    for (var i=0;i<len ;i++){
    tmpObj[this[i]]= this[i];
    }
    for(var x in tmpObj) {
    newArray.push[x];
    }
    return newArray;
    }

    [回复]

  2. welefen留言于:2010年08月03日21:07
  3. acsu留言于:2010年08月03日21:13

    Array.prototype.delRepeat=function(){
    var newArray=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    var s = typeof(item) + item;
    if (!provisionalTable[s]) {
    newArray.push(item);
    provisionalTable[s] = true;
    }
    }
    return newArray;
    }

    [回复]

  4. 愚人码头留言于:2010年08月04日13:16

    @acsu 感谢一下!这个方法很好,解决了字符串和数字问题,但是效率和我的第一个差不多,原因可能是for循环中定义变量中typeof操作有关

    [回复]

  5. 愚人码头留言于:2010年08月04日13:50

    @路人 感谢一下!这个方法很好,不过有个小bug,应该是:
    Array.prototype.delRepeat=function(){
    var newArray= [];
    var tmpObj = {};
    var len=this.length;
    for (var i=0;i<len ;i++){
    tmpObj[this[i]]= this[i];
    }
    for(var x in tmpObj) {
    newArray.push(x);
    }
    return newArray;
    }
    不过没有解决数字和字符串的转换问题。

    [回复]

  6. 愚人码头留言于:2010年08月04日13:51

    结合acsu 和 路人 的方法:
    Array.prototype.delRepeat = function(){
    var newArray = [];
    var tmpObj = {};
    var len = this.length;
    for (var i = 0; i < len; i++) {
    tmpObj[typeof(this[i])+this[i]] = this[i];
    }
    for (var x in tmpObj) {
    newArray.push(tmpObj[x]);
    }
    return newArray;
    }
    效率还是和我第一个两个for的效率差不多!悲剧!

    [回复]

  7. a11en留言于:2010年08月04日14:20

    检查:
    provisionalTable[item+1]

    provisionalTable[typeof item + item]

    [item+1] 应该效率稍微高些, 比文中方法 1 效率高, 但是比 2 肯定要低一些, 多了个计算

    [回复]

  8. ake留言于:2010年08月04日22:53

    之前看到的一种做法是在provisionalTable中存储的键值做加法运算。

    Array.prototype.delRepeat=function(){
    var newArray=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (!provisionalTable[0+item]) {
    newArray.push(item);
    provisionalTable[0+item] = true;
    }
    }
    return newArray;
    }
    但是这样就没办法对对象类型的数据进行去除重复项的操作了。。

    [回复]

  9. Rekey留言于:2010年08月06日08:50

    数组去重有个很需要考虑的东西.如果是
    [{},{},{}]似乎就基本无解了.

    [回复]

  10. Rekey留言于:2010年08月06日08:59

    附上我写的代码..

    Array.prototype.delRepeat=function(){
    var newArray=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (provisionalTable[item] !== item) {
    newArray.push(item);
    provisionalTable[item] = item;
    }
    }
    return newArray;
    }
    var a = ['6',6,7,8,9,2,3,5,3,2,5];
    alert(a.delRepeat()[0]+1);

    [回复]

  11. web前端寒风留言于:2010年08月08日18:08

    看后才知道,自己是js菜鸟。还要多加学习

    [回复]

  12. 网址兽留言于:2010年08月09日10:49

    以前做过测试,零时对象方式是效率最高的。
    这是我的方式:
    Array.prototype.unique = function () {
    var temp = new Array();
    this.sort();
    for(i = 0; i < this.length; i++) {
    if( this[i] == this[i+1]) {
    continue;
    }
    temp[temp.length]=this[i];
    }
    return temp;

    }

    sort()可以自定义对比函数,但是效率比较低.
    http://www.webucd.com/archives/168

    [回复]

  13. supersha留言于:2010年08月09日11:03

    不错的讨论,我也写过一篇这方面的文章,互相学习:
    http://www.ilovejs.net/archives/959

    [回复]

  14. hugh留言于:2010年10月21日16:58

    Array.prototype.distinct=function(){
    var result=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (provisionalTable[item]!==item) {
    result.push(item);
    provisionalTable[item] = item;
    }
    }
    return result;
    }
    如果要深层去重,如剔除具有完全相同属性和值的object,代码如下:
    Array.prototype.distinct=function(){
    var result=[];
    function isSame(o1,o2){
    if(!o1||!o2)return false;
    var b=true;
    for(var c in o1){
    if(!o2[c])return false;
    if(typeof o1[c]==”object”){
    b=isSame(o1[c],o2[c]);
    }else if(o1[c]!==o2[c]){
    return false;
    }
    }
    return b;
    }
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (!isSame(provisionalTable[item],item)) {
    result.push(item);
    provisionalTable[item] = item;
    }
    }
    return result;
    }

    [回复]

  15. zhenn留言于:2010年10月26日16:32

    我提供一个方法:
    function distinct(arr){
    var self = arr;
    var _a = arr.concat().sort();
    _a.sort(function(a,b){
    if(a === b){
    var n = self.indexOf(a);
    self.splice(n,1);
    }
    });
    return self;
    }

    [回复]

  16. fongsi留言于:2011年03月31日19:05

    把if里面判断的条件给改一下,可以改成这样:
    Array.prototype.unique = function () {
    var tempArr = [];
    var tempObj = {};
    for (var i = 0; i < this.length; i++) {
    if (!(this[i] in tempObj) || !(this[i] === tempObj[this[i]])) {
    tempArr.push(this[i]);
    tempObj[this[i]] = this[i]; // 这个可以用保存重复的元素
    }
    }
    return tempArr;
    }
    var test = [1,1,1,1,'1','abc'];
    alert(test.unique());

    [回复]

  17. cxybl留言于:2011年08月30日13:38

    这个好,解决了我的一个困扰了很久的问题

    [回复]

发表评论

*

*