Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

数组去重的思考 #13

Open
huangchucai opened this issue Jun 20, 2017 · 0 comments
Open

数组去重的思考 #13

huangchucai opened this issue Jun 20, 2017 · 0 comments

Comments

@huangchucai
Copy link
Owner

数组去重的思考

第一种

思路:比较新数组中是否有原数组中的重复项,如果有重复的就不添加到新数组

  • 循环数组,遍历数组的每一个元素
  • 对于新数组进行内部循环,如果发现数组中已经存在了arr[i],结束循环,如果新数组循环完成后,就可以添加
function unique(arr){
  var newarr = [];
  for(var i = 0; i<arr.length; i++){
    // 遍历新数组,判定是否元素已经存在
    for(var j=0;j<newarr.length; j++){
      if(arr[i]===newarr[j]){
        break;
      }
    }
    // 对于循环完成的元素进行push
    if(j == newarr.length){
        newarr.push(arr[i])
    }
  }
  return newarr     
}

第二种(不考虑兼容)

思路:如果一个元素的indexOf()不等于本身的索引就是重复的

function unique(arr){
  var newarr = [];
  arr.forEach((item,idx,array)=>{
    array.indexOf(item)===idx &&  newarr.push(item);
  })
  return newarr
}
// 反过来就是说我们过滤掉indexOf() 不等于本身的索引的元素
function unique(arr){
  var newarr = arr.filter((item,idx,array)=>{
    return array.indexOf(item)===idx;
  })  
  return newarr    
}

第三种(只针对数组都是数字)

思路:利用数组的sort()方法,相同的元素会被放到相邻的位置,然后比较前后位置就可以了。

function unique(arr){
  var newarr = arr.concat().sort().filter((item,idx,array)=>{
    // !idx是针对第一个元素,没有比较直接返回
    return !idx || item != array[idx-1];
  })
}
var a = [1, 1, 3, 2, 1, 2, 4];
unique(a); //[1, 2, 3, 4]
var a = [1, '1', 3, 2, 1, 2, 4];
unique(a); //[1, 2, 3, 4]

这里就有问题了,由于我们用的是不完成等于!=,所以这种情况只是针对于数字之间的比较,如果输入字符串,可能会被过滤掉。

**拓展:**为什么我这里不用严格的不等于呢?!==,这样的话就不能排除特殊情况下的数字,这里根据需求来写

// 如果是
    return !idx || item !== array[idx-1];
var a = [1, '1',1, 3, 2, 2, 4];
unique(a); //[1,'1',1, 2, 3, 4]

第四种 (ES6的set构造函数)

思路:通过es6的set的值唯一性,把数组去掉重复的,然后用Array.from()把迭代的对象变成数组

function unique(arr){
  return Array.from(new set(arr));
}

第五种(重复的元素会出现在数组的结尾,改变了数组的格局)

**思路:**利用for循环中,++i可以进入下一个循环,跳过已经重复的元素

function unique(a) {
  var res = [];

  for (var i = 0, len = a.length; i < len; i++) {
    for (var j = i + 1; j < len; j++) {
      // 这一步十分巧妙
      // 如果发现相同元素
      // 则 i 自增进入下一个循环比较
      if (a[i] === a[j])
        j = ++i;
    }

    res.push(a[i]);
  }

  return res;
}

var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => ["1", "2", 1]

参考链接
数组去重

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant