当前位置:首页 > 技术分析 > 正文内容

JS数组去重(js 数组去重的四种方法)

ruisui883个月前 (02-03)技术分析14

1、前端数组去重的方法

目标数组:

let targetArr = ['1', 1, 2, 3, 2, 1, true, false, true, 'false', {}, {}];


l 方法一:Set去重


Set(集合)保留插入元素的顺序,并且只包含唯一值,new Set(targetArr)接收一个数组作为参数,通过new Set(targetArr)我们得到的是一个伪数组,可以通过ES6新增的属性...(扩展符)将它转化成为一个数组:

let resArr = [...new Set(targetArr)];


console.log(resArr);// ['1', 1, 2, 3, true, false, 'false', {…}, {…}]


l 方法2:双层循环+splice

循环遍历数组,如果发现有相同元素就使用splice将其删除,就可以得到一个没有重复项的新数组,具体代码示例如下:

let targetArr = ['1', 1, 2, 3, 2, 1, true, false, true, 'false', {}, {}];


let fun = arr => {

let len = arr.length;


//异常判断,如果arr是一个空数组,那么直接返回arr

if (!len) {

return arr;

}

//这里使用提前计算好的arr数组的长度,避免每次循环都要计算一次arr的长度

for(let i = 0; i < len; i++) {

for(let j = i+1; j < len; j++) {

if (arr[i] === arr[j]) {

/**splice删除一个元素后,其后面的元素索引值都会减1,

* 所以需要使用j--以保证下次循环能够从正确的位置开始,

* 同时使用len--,可以减少不必要的循环,性能得到优化**/

arr.splice(j, 1);

len--;

j--;

}

}

}

return arr;

};


l 方法三:filter + indexOf

let targetArr = ['1', 1, 2, 3, 2, 1, true, false, true, 'false', {}, {}];


/**

* filter是es6新增的操作数组的方法,它的作用就是过滤数组

* 筛选出复合某一条件的值并返回一个新数组

* 它接收一个函数作为参数,该函数共有三个参数

* item :当前元素的值

* index:当前元素的索引值

* array: 原数组也就是我们的目标数组targetArr

*/

let res = targetArr.filter((item, index, array) => {

/**

* indexOf返回在数组中首次遇到的等于指定值的索引

* 所以只要不是重复项那么必indexOf返回的值必然和index相等

* 只要是不相等的必然是重复项

* */

return array.indexOf(item) === index;

});


l 方法4:include

let targetArr = ['1', 1, 2, 3, 2, 1, true, false, true, 'false', {}, {}];


let fun = arr => {

let res = [];

let len = arr.length;

for (let i = 0; i < len; i++) {

/**

* includes是ES6中操作字符串和数组的方法,

* 它可以判断一个数组或者字符串中是否包含某个指定值

* 如果包含则返回true,反之返回false

* 它的语法是: arr.includes(searchValue,[start]);

* arr表示当前数组

* 接收两个参数

* searchValue: 表示要查询的元素

* [start]:开始查找的索引,该参数可有可无

*/

if (!res.includes(arr[i])) {

res.push(arr[i]);

}

}

return res;

};


l 方法5:map

let targetArr = ['1', 1, 2, 3, 2, 1, true, false, true, 'false', {}, {}];


let fun = arr => {

let tempMap = newMap();

let res = [];

let len = arr.length;

for (let i = 0; i < i + 1; i++) {

/**

* map是ES6中的一种数组结构,类似于对象,

* 但是它里面的值可以是各种数据类型,

* map有一个方法has()可以判断当前map中是否包含指定值

* map.has(searchValue)返回的true/false

*/

if (!tempMap.has(arr[i])) {

tempMap.set(arr[i], true);

res.push(arr[i])

}

}

}; 作者:Web前端-搬砖小黄 https://www.bilibili.com/read/cv23257936 出处:bilibili

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/675.html

分享给朋友:

“JS数组去重(js 数组去重的四种方法)” 的相关文章

微软的Linux发行版终于加入了对XFS根文件系统的支持

当许多Linux发行版在评估新的根文件系统选项或甚至像OpenZFS这样的特性,微软内部Linux发行版到本月才开始支持XFS作为根文件系统选项。随着这个月对微软内部Linux发行版CBL-Mariner的更新,他们现在支持XFS作为根文件系统。到目前为止,这个用于微软内部各种目的的Linux发行版...

vue3中父子组件之间传值的详解

首先我们回顾一下vue2中父子组件是怎么传值的,然后对比vue3进行详解。一、vue2中父子组件传值<!-- 父组件 --> <template> <div> // name:父组件把值传给子组件test-child // childFn:...

79.idea中git合并分支操作分享

文章目录前言1.fetch的操作2.合并最新代码到当前的开发分支3.解决冲突4.分支合并:5.完成代码合并总结前言git的操作在日产的工作中也非常重要,团队化的代码管理,每次如果代码被别人覆盖或者自己的代码不能提交到服务器那是灾难性的结果,本篇进行一篇分享来总结下idea中git的操作帮助java开...

Java教程:gitlab-使用入门

1 导读本教程主要讲解了GitLab在项目的环境搭建和基本的使用,可以帮助大家在企业中能够自主搭建GitLab服务,并且可以GitLab中的组、权限、项目自主操作GitLab简介GitLab环境搭建GitLab基本使用(组、权限、用户、项目)2 GitLab简介GitLab是整个DevOps生命周期...

理解virt、res、shr之间的关系(linux系统篇)

前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟大家一起探讨的问题。...

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

本课程以业务驱动技术栈,打造业务相对完整的掌上医疗小程序,解决大家没有好的毕设项目或者求职项目的困境。本课程案例采用前后端分离架构,业务功能完善(既有WEB管理端,也有移动用户端),界面美观,无需艰涩的技术也能做出亮眼的作品。SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序 |...