代码改变世界

javascript去除重复项

2015-03-26 00:56  现代人  阅读(538)  评论(0编辑  收藏  举报

很多时候要对内容进行过滤,例如在有的输入框要求输入的内容不重复,如是需要对重复的内容进行过滤,那么最先想到的就是数组和字符串之间的来回转化,直到消除所有的重复项,以下消除重复项的思路是:先找出数组(如果是字符串那么先转化为数组)重复项的下标,然后将这些下标存储到新的数组;然后在这个新数组里取出这些下标值,接着通过这些下标值将原数组所在位置替换为空字符,接着用正则消除这些空字符,最后对结果的末尾字符删掉,那么替换重复内容完毕,以下是实现代码:

 1 <script type="text/javascript">
 2     var arr = [1, 5, 4, 8, 4, 5, 1, 1, 4987, 1, 5, "汉字", "汉字", 4, 5, 5, 4, 5, 8, 5, 8, 0, 5, 45, "hello", "j", "wolrd", "hello", "英文", "wolrd", "中文", "[]fdsaf", "f", "f", "hello", "hello", "中文"];
 3 
 4     function rest(arr) {
 5         var arr2 = [];
 6         for (var i = 0; i < arr.length; i++) {
 7             (function (n) {
 8                 var ele = arr[n];
 9                 for (var e = n + 1; e <= arr.length; e++) {
10                     if (ele == arr[e]) {
11                         arr2.push(e)
12                     }
13                 }
14             })(i)
15         }
16 
17         for (var j = 0; j < arr2.length; j++) {
18             arr[arr2[j]] = "";
19         }
20         var str = arr.join(",");
21         var newtStr = str.replace(/\s/g, '');
22         var allStr = newtStr.replace(/\,[*,]+/g, ',')
23         return allStr;
24     }
25 
26     var strAll = rest(arr);
27     var val = strAll.substring(0, strAll.length - 1);
28     console.log(val);
29     alert(val);
30 </script>








//____________________________________华丽的分割线_____________________________________________________

/*

今天在练习的时候发现数组去重的更简便方法,思路是,对要去重的数组进行遍历,在遍历的时候也复制一份该数组,用第一个数组的第一个和复制的数组进行每一个对

如果有重复项那么就用空格字符串替换,(注意数组在改变值的时候,复制该数组和之前的数组是同时改变,数组是指向的,不知复制的,对象(Object)也是如此,这是关键),
重复项都替换成字符串了,那么用正则替换相同重复字符串,接着防止末尾存在相同项,那么去除的不够彻底,由于只会在末尾才会出现这种情况,那么就好办了,直接去掉末尾空

字符串,也不用去遍历,下面是代码:

function arrUniq(){
    var  a = [1,5,4,2,1,5,4,5,4,1,5,4,12,4,5,12,5,"中文","中文",4,5,4,8,'中文','中文','英文','英文'];
    for(var i = 0;i<a.length;i++){
        var tmp = a[i], b = a,c;
        for(var n = i+1;n< b.length;n++){
            if(tmp === b[n]){
                a[n] ='';
            }
        }
    }
    c = a.join(",");
    c = c.replace(/,+/g,',');
    c = c.split(',');
    if(c[c.length-1] === ''){c = c.slice(0, c.length-1)}
    console.log(c);
}

arrUniq();

 

es6在处理这种问题时候显得特别容易:

var arr = [1,2,1,1,2,1,'中文','中文','a','a',undefined,undefined,null,null,true,true,,,,,,,,,,123,13];
var newArr = Array.from(new Set(arr));
console.log(newArr)Set

 Set:

  ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

 

Array.from:

Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象.

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};
 

// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']