其实数组去重的实现就分为两大类

  • 利用语法自身键不可重复性
  • 利用循环(递归)和数组方法使用不同的api来处理。

注意️:下列封装成方法的要在函数开始增加类型检测,为了让去重的实现代码更加简单易懂,封装时我会省略类型检测

function noRepeat(){
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
// XXX执行代码
}

利用键不可重复性

Set

原理:利用set存储的数据没有重复,结果为对象,需要再转换成数组

// 方法一
var arr = [1,1,2,1,3,4,5];
var set = new Set(arr);
console.log(Array.from(set))
// 方法二
[...new Set(arr)];

利用对象的属性

原理:利用对象的属性唯一(速度快,占空间多,用空间来换时间)

var res = [];
var obj = {};
for(var i=0; i<arr.length; i++){
if(!obj[arr[i]] ){
obj[arr[i]] = 1;
res.push(arr[i]);
}
}

Map

原理:利用map对象不重复,思路和对象属性一致。

function arrayNonRepeatfy(arr) {
let map = new Map();
let array = new Array(); // 数组用于返回结果
for (let i = 0; i < arr.length; i++) {
if(map .has(arr[i])) { // 如果有该key值
map .set(arr[i], true);
} else {
map .set(arr[i], false); // 如果没有该key值
array .push(arr[i]);
}
}
return array ;
}

利用数组下标不能重复(仅适用纯数字数组)

原理:利用数组下标不能重复。

function norepeat(arr){
var newArr = [];
var arrs = [];
for(var i=0;i<arr.length;i++){
var a = arr[i];
newArr[a] = 1;
}
for(var i in newArr){
arrs[arrs.length] = i;
console.log(i);
}
}

利用循环(递归)和数组方法使用不同的api

indexOf()

原理:利用indexOf检测新数组是否有当前元素,没有则添加。

方式一 检测新数组是否有当前元素
function norepeat(arr){
var newarr = [];
for(var i in arr) {
if(newarr.indexOf(arr[i]) == -1){
newarr.push(arr[i]);
}
}
return newarr;
} 方式二 检测当前元素第一次出现的位置和当前位置是否相等,相等则添加
function norepeat(arr){
var newarr = [arr[0]]; //默认加入第一个数 因为第一个数没比较的必要
for(var i =1;i<arr.length;i++){
if(arr.indexOf(arr[i])==i){
newarr.push(arr[i])
}
}
return newarr;
} 方式三 filter和indexOf
function unique(arr) {
return arr.filter(function(item, index, arr) {
//当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
return arr.indexOf(item, 0) === index;
});
}

includes()

原理:利用includes检测新数组中是否含有当前元素,没有则添加

方式一 利用普通for循环和includes
function norepeat(arr) {
var newarr =[];
for(var i = 0; i < arr.length; i++) {
if(!newarr.includes(arr[i])) { //includes 检测数组是否有某个值
newarr.push(arr[i]);
}
}
return array
} 方式二 利用reduce和includes
function norepeat(arr){
return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}

注意️:indexOf和includes均可以和for循环,reduce配合使用

sort()

原理:先利用sort排序再比较相邻的是否相等

// 方法一 检测相邻相等则添加到新数组
function norepeat(arr) {
arr = arr.sort()
var arrry= [arr[0]];
for(var i = 1; i < arr.length; i++) {
if(arr[i] !== arr[i-1]) {
arrry.push(arr[i]);
}
}
return arrry;
} // 方式二 在原数组上检测,相邻元素相同则删除
function norepeat(arr) {
arr.sort(function (a, b) { return a - b; });
for (var i = 0; i < arr.length; i++) {
if (arr[i] == arr[i + 1]) {
arr.splice(i, 1);
i--;
}
}
return arr;
}

递归

原理:借用递归比较 index和index-1位是否相同,相同则删除

function noRepeat(arr) {
// 获取长度
var len = arr.length;
//对数组进行排序才能方便比较
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函数进行去重
}
}
loop(len - 1);
return arr;
};

最新文章

  1. html5与css3
  2. JavaScript学习笔记7 之DOM文档对象模型
  3. Lua面向对象
  4. UEFI引导在GPT分区下安装win2008——抓住那只傲娇的win2008
  5. Xcode 6制作动态及静态Framework
  6. 计算机视觉:关于视觉算法源码中常出现的imageLib库的使用指南
  7. ios 消息推送流程 转载
  8. (三)uboot源码分析
  9. 洗清UI自动化鸡肋说的不白之冤
  10. C# WinForm 上传图片,文件到服务器的方法Uploader.ashx
  11. A Full Hardware Guide to Deep Learning
  12. Android ActionBar详解(三):ActionBar实现切换Tabs标签
  13. javamail发送邮件(转)
  14. JavaScript 部分对象方法记叙 ing...
  15. JS操作数组常用的方法
  16. ##5.2 Nova计算节点-- openstack pike
  17. XP下 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll 的解决办法
  18. Android PowerManager电源管理(Android N )
  19. linux 因内存不足而 kill 掉 java 程序
  20. CSS 选用字体

热门文章

  1. 连通图算法详解之① :Tarjan 和 Kosaraju 算法
  2. 03-java实现循环链表
  3. java 序列化流与反序列化流
  4. 2020-06-01:百万级int数据量的一个array求和。
  5. C#LeetCode刷题-随机数
  6. JS实例-全选练习
  7. 如何解决Mybatis 日期查询时后面带.0
  8. 【WC2013】 糖果公园 - 树上莫队
  9. C++用递归实现斐波那契数列
  10. jraft日志复制