javaScript实现去重的几种方法

目录

利用ES6的set

利用双指针

利用splice直接在原数组进行操作

利用对象的属性不能相同的特点进行去重

数组递归去重

利用indexOf以及forEach/map/filter

利用reduce

补充

去掉重复ID的对象 


基本数据let arr = [1,2,3,4,1,5,5,'a','d','b','b'];

利用ES6的set

let setArr = [...new Set(arr)];
console.log(setArr);

利用双指针

var removeDuplicates = function(nums) {
 const n = nums.length
    const list = []
    if (n === 0){
      return false;
    }
    let fast = 0,slow = 0;
    while (fast < n){
      if (nums[fast +1 ] !== nums[fast]){
        list[slow] = nums[fast]
        ++slow;
      }
      ++fast;
    }
    return list
};

时间复杂度:O(N)  空间复杂度:O(1) 

利用splice直接在原数组进行操作

function spliceArr(arr) {
    for (let i = 0;i<arr.length;i++){
      for (let j = i+1; j<arr.length;j++){
        if (arr[i] === arr[j]){
          arr.splice(j,1);
        }
      }
    }
    return arr;
  }
  let b = spliceArr(arr);
  console.log(b);

时间复杂度:O(N²)  空间复杂度:O(1)  

利用对象的属性不能相同的特点进行去重

function objectArr(arr) {
    let obj = {};
    let array = [];
    for (let i=0;i<arr.length;i++){
      if(!obj[arr[i]]){
        obj[arr[i]] = 1; // 可以随便设置
        array.push(arr[i]);
      }
    }
    return array;
  }
  let c = objectArr(arr);
  console.log(c);

时间复杂度:O(N)  空间复杂度:O(N)   

数组递归去重

function redArr(arr) {
    arr.sort(function (a,b) {
      return a - b;
    });
    function loop(index) {
      if (index>=1){
        if (arr[index] === arr[index-1]){
          arr.splice(index,1);
        }
        loop(index-1);
      }
    }
    loop(arr.length - 1);
    return arr;
  }
  let d = redArr(arr);
  console.log(d);

时间复杂度:O(NlogN)  空间复杂度:O(logN)    

利用indexOf以及forEach/map/filter

function eachArr(arr) {
    let array = [];
    arr.forEach((v,i,arr)=>{
      let bool = arr.indexOf(v,i+1);
      if (bool === -1){
        array.push(v);
      }
    });
    return array;
  }
  let e = eachArr(arr);
  console.log(e);

时间复杂度:O(N)  空间复杂度:O(N)     

利用reduce

let newArr = arr.reduce(function (prev, cur) {
    prev.indexOf(cur) === -1 && prev.push(cur);
    return prev;
  },[]);
  console.log(newArr);

时间复杂度:O(N)  空间复杂度:O(N)      

补充

// 判断是否存在重复元素 [1,2,3,1]
let containsDuplicate = function(nums) {
     const set = new Set();
        for (const x of nums) {
          if (set.has(x)) {
            return true; // 存在重复的元素,返回true
          }
          set.add(x);
        }
        return false;
};

时间复杂度:O(N)  空间复杂度:O(N)      

去掉重复ID的对象 

let array = [
   {id:1,name:"张三"},
   {id:2,name:"李四"},
   {id:1,name:"赵五"},
   {id:3,name:"赵五"},
   {id:3,name:"赵五"},
 ];
let arrayMap = array.map(item =>{
  return item.id
})
  let newList = array.filter(item =>{
    return arrayMap.indexOf(item.id) === arrayMap.lastIndexOf(item.id)
  })
 console.log(newList); //  {id:2,name:"李四"},

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值