js去数组中的重复元素function unique(data){
    data = data || [];
    var a = {};         
    for (var i=0; i<data.length; i++) {
        var v = data[i];
        if (typeof(a[v]) == 'undefined'){
            a[v] = 1;
        }
    };
    data.length=0;
    for (var i in a){
        data[data.length] = i;
    }
    return data;
   }

解决方案 »

  1.   


    //理解{}解构的话,应该就能理解了
    function unique(data){
      data = data || [];//防止data是null
      var a = {};
      for (var i=0; i<data.length; i++) {
        var v = data[i];
    //如果a[v]是空的,即a里面还没有v这个键,则加入,因为键是唯一的,所以达到了去除重复的目的
        if (typeof(a[v]) == 'undefined'){
          a[v] = 1;//等于1不是必须,等于10,等于'abc'都无所谓
        }
      }
      data.length=0;//清理原来的数组
      for (var i in a){//遍历键,把键存入数组
        data[data.length] = i;
      }
      return data;
    }
      

  2.   


    // 例如调用时 var tData = ['a', 'b', 'c', 'a', 'e']; unique(tData);
    function unique(data){
      data = data || []; // 保证数据可用
      var a = {}; // 注册容器
      
      // 迭代data数组 注册值
      for (var i=0; i<data.length; i++) {
      var v = data[i]; // v在每轮迭代中分别表示'a', 'b', 'c', 'a', 'e'
      // 此处检查,如果注册容器a中没有找到key是data中已有的值,则将其注册
      // 反之则跳过
      if (typeof(a[v]) == 'undefined'){
       a[v] = 1;
      }
      };
      // 循环结束后a的值为
      // a = {'a':1, 'b':1, 'c':1, 'e':1}
      // 可以看到a对象中键的就是已经去了重的data数据
      // 剩下的就是要将a中的键重新组成一个新的数组
      
      // 重置数组 切不切断对象引用
      data.length=0;
      // 此时外部tData成为了一个空数组,同时与tData持有相同引用的函数内部的data也是一个空数组
      
      // 将注册容器中的key作为值组成一个数组重新填入data中
      for (var i in a){ // 对a中的属性进行迭代 每轮迭代 i 的值分别是 'a', 'b', 'c', 'e'
       data[data.length] = i; // 这里正好根据每轮迭代的i重新填入data数组
      }
      
      // 此时因为tData与data持有相同的对象引用,所以他们的值都是
      // ['a', 'b', 'c', 'e']
      
      // 这个return其实不是必须的
      // 因为上面的所有操作中data变量都没有更换对象引用
      // 在函数内部对data的操作对外部传入的对象已经起作用
      return data;
    }
      

  3.   

    // 例如调用时 var tData = ['a', 'b', 'c', 'a', 'e']; unique(tData);
    function unique(data){
      data = data || []; // 保证数据可用
      var a = {}; // 注册容器
      
      // 迭代data数组 注册值
      for (var i=0; i<data.length; i++) {
          var v = data[i]; // v在每轮迭代中分别表示'a', 'b', 'c', 'a', 'e'
          // 此处检查,如果注册容器a中没有找到key是data中已有的值,则将其注册
          // 反之则跳过
          if (typeof(a[v]) == 'undefined'){
              a[v] = 1;
          }
      };
      // 循环结束后a的值为
      // a = {'a':1, 'b':1, 'c':1, 'e':1}
      // 可以看到a对象中键的就是已经去了重的data数据
      // 剩下的就是要将a中的键重新组成一个新的数组
      
      // 重置数组 切不切断对象引用
      data.length=0;
      // 此时外部tData成为了一个空数组,同时与tData持有相同引用的函数内部的data也是一个空数组
      
      // 将注册容器中的key作为值组成一个数组重新填入data中
      for (var i in a){ // 对a中的属性进行迭代 每轮迭代 i 的值分别是 'a', 'b', 'c', 'e'
          data[data.length] = i; // 这里正好根据每轮迭代的i重新填入data数组
      }
      
      // 此时因为tData与data持有相同的对象引用,所以他们的值都是
      // ['a', 'b', 'c', 'e']
      
      // 这个return其实不是必须的
      // 因为上面的所有操作中data变量都没有更换对象引用
      // 在函数内部对data的操作对外部传入的对象已经起作用
      return data;
    }