昨天笔试的时候遇到一个题目,给Array原型添加一个方法,要求去除数组重复元素:Array.prototype.deleteEle=function(){
 var o={},newArr=[],i,j;
 for( i=0;i<this.length;i++){
  if(typeof(o[this[i]])=="undefined")
  {
  o[this[i]]="";
  }
 }
 for(j in o){
 newArr.push(j)
 }
 return newArr;
}这是我自己学的一个,请大家看看还有没有其它的方法?

解决方案 »

  1.   

    先sort
    然后循环取值判断
    跟上一个取值相同即删除
      

  2.   

    var arr=["a","b","c","a"];
    alert(arr.reverse().join(",").match( /([^,]+)(?!.*\1)/ig).reverse());
      

  3.   

    这个代码写得很有创意,为何要加上reverse()不解
    用var arr=["ba","bc","a","c","b","a"];测试就会不正确
    修改为这样:
    var arr=["a","b","c","a","ba","bc"];
    alert(arr.join(",").match( /([^,]+)(?!.*,\1(,|$))/ig));
      

  4.   

    function unique(array) {
    var ret = [], record = {},it,tmp,obj = "__object__", bak = [],i,len;
    var type ={
    "number": function(n) { return "__number__" + n; },
    "string": function(n) { return "__string__" + n; },
    "boolean": function(n) { return "__boolean__" + n; },
    "undefined": function(n) { return "__undefined__"; },
    "object": function(n) {
    return n === null ? "__null__" : obj in n ? n[obj] : ( n[obj] = obj + bak.push(n) );
    }
    };
    for (i = 0, len = array.length; i < len; i++) {
    it = array[i]; tmp = type[typeof it](it);
    if (!(tmp in record)) { ret.push(it); record[tmp] = true; }
    }
    for (i = 0, len = bak.length; i < len; delete bak[i++][obj]) { }
    return ret;
    };
    可以参考这个
      

  5.   

    <script language="javascript">
    //数组A,B,排除A,B重复的,组成新数组h,如果排除一个,只要循环A,如果还有C数组,自己再加 
    var h=new Array();
    for(i=0;i<A.length;i++)
    {    eval("h['"+s_sp[i]+"']=s_sp[i]")
    }
    for(i=0;i<b.length;i++)
    {    eval("h['"+s_sp[i]+"']=s_sp[i]")
    }
      

  6.   


    使用reverse能保证原数组顺序
      

  7.   

    帮你修改了下,
    ,首先变量缓存数组this,
    然后数组添加元素push可能会慢一点
    添加了类似判断,Array.prototype.deleteEle=function(){
        var arr=this,o={},newArr=[],i,n;
        for( i=0;i<arr.length;i++){
            n=arr[i]+typeof(arr[i]);//如果不需要类型判断,直接将后面的去掉即可
            if(typeof(o[n])==="undefined"){
                newArr[newArr.length]=arr[i]
                o[n]=1;//缓存
            }
        }
        return newArr;
    }
      

  8.   

    不如去搜索下eval is evil
    尽量避免用eval,这里明明没必要用的,
    reverse是什么 意思?
      

  9.   

    最原始的方法 Array.prototype.deleteEle=function(){
    var newArr = this;
    for (var i=newArr.length-1; i>=0; i--)
    {
    var targetNode = newArr[i];
    for (var j=0; j<i; j++)
    {
    if(targetNode == newArr[j]){
    newArr.splice(i,1);
    //alert(arr);
    break;
    }
    }
    }
    return newArr;
    }
    var arr = ["a","b","c","c","ab","d","ab","d","c"];
    alert(arr.deleteEle());
      

  10.   

    用splice在里面多了一个for效率应该不好吧?
      

  11.   

    我的项目中有一个,好像也是以前在网上找的,分享。
    Array.prototype.distinct=function(){
        var a=[],b=[];
        for(var prop in this){
            var d = this[prop];
            if (d===a[prop]) continue; //防止循环到prototype
            if (b[d]!=1){
                a.push(d);
                b[d]=1;
           }
        }
        return a;
    }
      

  12.   


    <script language="javascript">   
    var rowValue="";
    for(var i=0;i<rowid.length;i++){
      var rowidvaleu = rowid[i];
      if(rowValue == rowidvaleu){
        //删除重复的数据
        rowid.removeSplice(i); 
      }
      rowValue= rowidvaleu;
    }/**以用splice来实现  
       *方法:Array.removeSplice(index)  
       * 功能:删除数组元素.  
       * 参数:index删除元素的下标.  
       * 返回:在原数组上修改数组  
       */  
    Array.prototype.removeSplice = function(index)   
    {   
        if(isNaN(index)||index>this.length){   
            return false;   
        }   
        this.splice(index,1);   
    }   
      
    </script>