JavaScript 数组去重部分方法

1. for 循环嵌套

  • 简单 for 嵌套,把每个元素都和后边的元素对比一下,如果重复,用 arr.splice()删除即可
  • //会改变原数组,所以用for更优
    var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6];
    for (var i = 0; i < arr.length; i++) {
      for (var j = i + 1; j < arr.length; ) {
        if (arr[i] === arr[j]) {
          arr.splice(j, 1);
          continue;
        }
        j++;
      }
    }
    console.log(arr);
    
    //或者使用占位原理,当然这样也会改变原数组,在这里看着其实比上边更加繁琐,但是可以提供一个防止数组塌陷的新思路,在其他地方(比如求被几和几整除的数)可以用到
    var cut = "#";
    for (var i = 0; i < arr.length; i++) {
      for (var j = i + 1; j < arr.length; j++) {
        if (arr[i] === arr[j]) {
          arr.splice(j, 1);
          arr.splice(j, 0, cut);
        }
      }
    }
    var i;
    while ((i = arr.indexOf(cut)) !== -1) {
      if (arr[i] === cut) {
        arr.splice(i, 1);
      }
    }

      

2.布尔值判断

  • 建立一个新数组 arr1,当 bool 为 false 时即新数组中没有这个元素时,用 push 将此元素添加到新数组 arr1 中,判断如果 bool 为 true 时即新数组 arr1 有这个元素时,所以不执行 arr1.push()
var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6];
//用布尔值判断,不改变原数组,所以原数组用for遍历和forEach遍历皆可
var arr1 = [];
for (var i = 0; i < arr.length; i++) {
  var bool = false;
  for (var j = 0; j < arr1.length; j++) {
    if (arr1[j] === arr[i]) {
      bool = true;
      break;
    }
  }
  if (!bool) arr1.push(arr[i]);
}
console.log(arr1);

//原函数用forEach遍历;

var arr1 = [];
arr.forEach((i) => {
  var bool = false;
  for (var j = 0; j < arr1.length; j++) {
    if (arr1[j] === arr[i]) {
      bool = true;
      break;
    }
  }
  if (!bool) arr1.push(arr[i]);
});
console.log(arr1);

3. 用 indexOf 去重

  • arr.indexOf(元素,从下标第几位开始向后查找)查找元素所对应的下标,如果找到了就返回找到第一个下标,如果没有找到返回-1
  • 与布尔值方法相同,当新数组没有找到此元素,即下标为-1 (arr[i] < 0) 时,用 push 将此元素添加到新数组 arr1 中
//不改变原数组
var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6];
var arr1 = [];
for (let i = 0; i < arr.length; i++) {
  if (arr1.indexOf(arr[i] < 0)) {
    arr1.push(arr[i]);
  }
}
console.log(arr1);

4. 用 includes 去重

  • arr.includes(元素);判断当前数组中是否有这个元素,如果有返回 true,否则返回 false
  • 原理与布尔值方法和 indexOf 方法相同,当新数组没有找到此元素即 includes 返回 false 时,作取反后为 true,达成条件用 push 将此元素添加到新数组 arr1 中
  • includesAPI ES6 存在,可能存在兼容性问题
var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6];
var arr1 = [];
for (var i = 0; i < arr.length; i++) {
  if (!arr1.includes(arr[i])) {
    arr1.push(arr[i]);
  }
}
console.log(arr1);

5. 套用 reduce 去重

  • reduce 函数有四个值分别是 Accumulator (acc) (累计器),Current Value (cur) (当前值),Current Index (idx) (当前索引),Source Array (src) (源数组)
    • 回调函数第一次执行时,accumulator 和 currentValue 的取值有两种情况:如果调用 reduce()时提供了 initialValue 初始值,accumulator 取值为 initialValue,currentValue 取数组中的第一个值;如果没有提供 initialValue,那么 accumulator 取数组中的第一个值,currentValue 取数组中的第二个值。 - 如果给了初始值,value 返回的是 return 给的值,value 的从初始值开始,item 会从第一个元素开始 - 详细查看https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
  • 这里 reduce 给出的初始值 initialValue 是[],所以 reduce 函数的返回值分配给累计器 acc,即新数组中没有此值,将返回此值给累计器 acc,执行条件与 indexOf 方法原理一样,逐步形成一个没有重复值的新数组
var arr = [1, 2, 2, 3, 4, 4, 5, 6, 5, 6, 7, 8, 9];
var arr1 = arr.reduce(function (acc, cur) {
  if (acc.indexOf(item) < 0) acc.push(cur);
  return acc;
}, []);
console.log(arr1);

6. 先排序,再判断是否是满足需求的值(不重复)满足i进位把值传给i

(是采用了某位大神zhen12321的盲人摸硬币法)

arr.sort(function (a, b) {
  return a - b;
});
var i;
for (i = 0, j = 1; j < arr.length; j++) {
  if (arr[j] !== arr[j - 1]) {
    arr[++i] = arr[j];
  }
}
arr.length = i + 1;

7.这个用的是方法去重,没错!是利用set的不重复性来转换一下

var arr=[1,4,2,1,2,3,2,1,1,2,3];
// var s=new Set(arr);
// console.log(Array.from(s))
arr=Array.from(new Set(arr));
console.log(arr)

8.(新更新)利用对象键名不重复性去重

        var arr = [1, 3, 5, 2, 3, 4, 5, 6, 3, 4];
        arr = Object.values(arr.reduce((v, t) => {
            v["a"+t] = t;
            return v
        }, {}))
        console.log(arr)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小码~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值