search

Home  >  Q&A  >  body text

javascript - 数组去重没成,怎么办

数组去重
function func(arr){
 var res = [arr[0]];
 for(var i = 1; i < arr.length; i++)
  for(var j = 0; j < res.length; j++)
   if(arr[i] == res[j])
    break;
  else 
   res.push(arr[i]);
   return res;
}
var arr = [1, 1,2,2,3]
alert(func(arr));//1,2,2,3,3,3??为什么会这样?应该是1,2,3啊
大家讲道理大家讲道理2902 days ago188

reply all(7)I'll reply

  • 阿神

    阿神2017-04-10 17:15:53

    你主要是把内外层 for 的逻辑搞混淆了,内层主要是找有没有重置,外层才应该处理是否 push

    function func(arr) {
        var res = [arr[0]];
        for (var i = 1; i < arr.length; i++) {
            var isFound = false;
            for (var j = 0; j < res.length; j++) {
                if (arr[i] == res[j]) {
                    isFound = true;
                }
            }
            if (!isFound) {
                res.push(arr[i]);
            }
        }
        return res;
    }
    var arr = [1, 1, 2, 2, 3];
    alert(func(arr));

    更建议把内外层分开

    function find(v, res) {
        for (var j = 0; j < res.length; j++) {
            if (v == res[j]) {
                return true;
            }
        }
        return false;
    }
    
    function func(arr) {
        var res = [arr[0]];
        for (var i = 1; i < arr.length; i++) {
            if (!find(arr[i], res)) {
                res.push(arr[i]);
            }
        }
        return res;
    }
    var arr = [1, 1, 2, 2, 3];
    alert(func(arr));

    当然既然这样分开了,上面的 find 就可以直接用原生函数 Array.prototype.indexOf代替了

    function func(arr) {
        var res = [arr[0]];
        for (var i = 1; i < arr.length; i++) {
            if (res.indexOf(arr[i]) < 0) {
                res.push(arr[i]);
            }
        }
        return res;
    }
    var arr = [1, 1, 2, 2, 3];
    alert(func(arr));

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:15:53

    如果想省事的话可以使用 lodash的 union 函数
    自己写可以参考下面的代码

    function union(arr){
        var tmpObj={};
        var ret=[];
        for(var i = 1; i < arr.length; i++){
            var v=arr[i];
            if(!tmpObj[v]){
                ret.push(v);
                tmpObj[v]=1;
            }
    
        }
        return ret;
    }

    reply
    0
  • 黄舟

    黄舟2017-04-10 17:15:53

    逻辑有问题~~~

    for(var j = 0; j < res.length; j++)  //这里遍历 res 数组 判断是否重复
       if(arr[i] == res[j])              //结果,你如果遇到不等于 res 中的元素
        break;
       else 
        res.push(arr[i]);                //就push元素到res了
                                         // 应该 比较完 res 中所有元素, 再决定是否 push到 res
    
    function func(arr){
     var res = [arr[0]];
     for(var i = 1; i < arr.length; i++)
       if ( check(res, arr[i]) )
         res.push(arr[i]);
    
       return res;
    }
    
    function check(res, item){
      for(var j = 0; j < res.length; j++)
        if(item == res[j])
          return false;
      
      return true;
    }
    var arr = [1, 1,2,2,3]; func(arr)

    reply
    0
  • 黄舟

    黄舟2017-04-10 17:15:53

    ...
      for(var j = 0; j < res.length; j++)
       if(arr[i] == res[j])
        break;
      else 
       res.push(arr[i]);
    ...

    不管哪种程序,尽量避免在循环自身的时候,还去更改自身内容,特别是去增删元素。

    另外,那个写法效率不行,展示一下ES6的实现吧:

    function func(a) {
       return Array.from(new Set(a));
    }

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:15:53

    function func(arr){

        var res = arr;
        for(var i = 1; i < arr.length; i++){
            for (var j = i + 1; j < arr.length; j++) {
                if (arr[i] === arr[j]) {
                    arr.splice(j, 1);  //删除指定下标的元素
                    i = -1;
                    break;
                }
            }
        }
        return res;
    }
    var arr = [1, 1,2,2,3];
    alert(func(arr));

    reply
    0
  • PHPz

    PHPz2017-04-10 17:15:53

    这是你要的去重

    [1, 1,2,2,3].filter(function(v, i, m) {
            return i <= m.indexOf(v);
        });
        
        

    至于为啥你写的不行,上面已经有人给出答案了

    reply
    0
  • 黄舟

    黄舟2017-04-10 17:15:53

    最简单的改法:

    function func(arr){
     var res = [arr[0]];
     for(var i = 1; i < arr.length; i++)
      for(var j = 0; j < res.length; j++)
       {if(arr[i] == res[j])
        break;    
        if(j==res.length-1)//改动的地方!!
         res.push(arr[i]);
       }
       return res;
    }
    var arr = [1, 1,2,2,3]
    alert(func(arr));//1,2,2,3,3,3
    

    reply
    0
  • Cancelreply