首页 > 数组去重没成,怎么办

数组去重没成,怎么办

数组去重
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啊

你主要是把内外层 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));

最简单的改法:

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

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));

这是你要的去重

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

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


...
  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));
}

如果想省事的话可以使用 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;
}

逻辑有问题~~~

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)
【热门文章】
【热门文章】