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

  • 利用语法自身键不可重复性
  • 利用循环(递归)和数组方法使用不同的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;
};

JS数组去重的实现的更多相关文章

  1. js数组去重的4种方法

    js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...

  2. JS 数组去重(数组元素是对象的情况)

    js数组去重有经典的 几种方法 但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现. 因为: 1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致 ...

  3. js数组去重常用方法

    js数组去重是面试中经常会碰到的问题,无论是前端还是node.js数组常见的有两种形式,一种是数组各元素均为基本数据类型,常见的为数组字符串格式,形如['a','b','c'];一种是数组各元素不定, ...

  4. js 数组去重小技巧

    js 数组去重小技巧 Intro 今天遇到一个问题,需要对数据进行去重,想看一下有没有什么比较方便的方法,果然有些收获. Question 问题描述: 我有一个这样的数据: [ { "Pro ...

  5. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  6. js数组去重五种方法

    今天来聊一聊JS数组去重的一些方法,包括一些网上看到的和自己总结的,总共5种方法(ES5). 第一种:遍历数组法 这种方法最简单最直观,也最容易理解,代码如下: var arr = [2, 8, 5, ...

  7. js数组去重的方法(转)

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  8. js 数组去重方法汇总

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. js数组去重 javascript版

    //js数组去重 //思路: // 1.放入第一个元素 // 2.放入第n个元素,和第n个之前的元素就行比较,如果有重复,则跳过.没有重复就加入数组中 // 3.返回新的去重后数组 Array.pro ...

  10. js数组去重(多种方法)

    // js数组去重 Array.prototype.fun1 = function(){ var arr = this, result = [], i, len = arr.length; for(i ...

随机推荐

  1. C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4003 访问. 我们把符合下列属性的数组 A 称作山脉: A.le ...

  2. C#开发笔记之03-为什么选择IsNotXXX方法而不是IsXXX方法?

    C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/959 访问. 为什么有时候要选择IsNotXXX方法而 ...

  3. 为什么你的 64-bit 程序可能占用巨大的虚拟空间

    出于很多目的,我从最新的 Go 系统内核开发源码复制了一份代码,在一个正常的运行环境中构建(和重新构建)它,在构建版本基础上周期性地重新构建 Go 程序.近期我在用 ps 查看我的一个程序的内存使用情 ...

  4. 不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序

    一般我们写好了应用程序想要部署发布它,要么发布到物理机,要么发布到虚拟机,要么发布到容器来运行它.现在有了Azure应用服务,我们可以完全不用管这些东西,只管写好自己的代码,然后使用VisualStu ...

  5. span和input布局时对不齐

    如图 在span和input的css里各添加一行代码: vertical-align:top; (span和input在同一个盒子里)

  6. 使用 JSON 协议的 gRPC

    JSON payload 实现简易的请求和响应的内省. 介绍 大家经常说 gRPC 是基于 Google Protocol Buffers payload 格式的,然而这不完全正确.gRPC payl ...

  7. 简单快速导出word文档

    最近,我写公司项目word导出功能,应该只有2小时的工作量,却被硬生生的拉长2天,项目上线到业务正常运行也被拉长到2个星期. 为什么如此浪费时间呢? 1)公司的项目比较老,采用硬编码模式,意味着wor ...

  8. excel如何写宏?如何用按钮?

    注:本次测试版本 excel版本2019 写宏? 准备工作(使用宏的一切前提)===========文件-选项-自定义功能区 (勾选开发工具) 开始写宏=======右击sheet1--查看代码    ...

  9. leetcode刷题记录——链表

    使用java实现链表 单向链表 双向链表 单向循环链表 双向循环链表 题目记录 160.相交链表 例如以下示例中 A 和 B 两个链表相交于 c1: A: a1 → a2 c1 → c2 → c3 B ...

  10. windows下RocketMQ的安装部署

    一.预备环境 1.系统 Windows 2. 环境 JDK1.8.Maven.Git 二. RocketMQ部署 1.下载 1.1地址:http://rocketmq.apache.org/relea ...