js数组去重方法包括Es6(方法有很多,但是需要考虑兼容性和数据类型场景)
1、Es6提供的方法
<script type="text/javascript">
//ES6里新添加了两个方法,set(set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目)
//Array.from(类数组对象、可迭代对象转化为数组)。
var arr = [1, 2, 3, 2, 4, 5, 5, null, null, undefined, undefined, NaN, NaN]
const item = new Set(arr);
const newArr = Array.from(item);
console.log(newArr, '去重后的数组')//[1, 2, 3, 4, 5, null, undefined, NaN] "去重后的数组"
const arr1 = [1,1,2,3,4,4,3,5,5,5,6,7,8,8];
console.log(noRepeat(arr1,'去重后'))//[1, 2, 3, 4, 5, 6, 7, 8]
//ES6方法去重封装(目前主流的浏览器,Chrome,Firfox,Opera,Safari,包括微软的Edge,都是支持的,唯独IE系列不支持,所以慎用 )
function noRepeat(arr) {
return Array.from(new Set(arr));
}
</script>
<script type="text/javascript">
var arr = [NaN,NaN,undefined,undefined,false,false,true,true,1,1,2,3,4,5,33,33,4,5,6];
arr = [...new Set(arr)];
console.log(arr,'去重后');//[NaN, undefined, false, true, 1, 2, 3, 4, 5, 33, 6] "去重后"
</script>
2.下标查询(通常简单做法)
<script type="text/javascript">
//(普通做法)
const list = [1,2,3,4,5,3,4,5,3,6];
console.log(noRepeat(list),'去重后');//[1, 2, 3, 4, 5, 6] "去重后"
//ie8以下不支持indexOf()方法
function noRepeat(arr) {
var newArr = [];
for(var i = 0; i < arr.length; i++) {
if(newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
</script>
<script type="text/javascript">
//下标检索
//实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组。
function noRepeat(arr) {
var temp = [];
for(var i = 0; i < arr.length; i++) {
//如果当前数组的第i项在当前数组中第一次出现的位置是i,才存入数组;否则代表是重复的
if(arr.indexOf(arr[i]) == i) {
temp.push(arr[i])
}
}
return temp;
}
var list = [1,2,3,33,33,2,3,2,3,4,6,7,9];
console.log(noRepeat(list),'去重后');//[1, 2, 3, 33, 4, 6, 7, 9] 去重后
</script>
3.用对象属性去重
<script type="text/javascript">
//每次取出原数组的元素,然后再对象中访问这个属性,如果存在就说明重复;
var arr = [1, 2, 3, 3, '1', '1', '去掉', '去掉', NaN, NaN, false, false];
var obj = {};
var temp = [];
for(var i = 0; i < arr.length; i++) {
var type = Object.prototype.toString.call(arr[i]); //加类型判断数据类型 如区分 1 '1'
if(!obj[arr[i] + type]) {
temp.push(arr[i]);
obj[arr[i] + type] = true; //这里给true利于代码阅读和判断,如果给 0,'' ,false ,undefined 都会在if那里判断为 false不利于代码阅读
}
}
console.log(temp, '去重') //[1, 2, 3, "1", "去掉", NaN, false] "去重"
</script>
<script type="text/javascript">
//封装一下;
function noRepeat(arr) {
var newArr = [];
var obj = {};
for(var i = 0; i < arr.length; i++) {
var type = Object.prototype.toString.call(arr[i]); //加类型判断数据类型 如区分 1 '1'
if(!obj[arr[i] + type]) {
newArr.push(arr[i]);
obj[arr[i] + type] = true; //这里给true利于代码阅读和判断,如果给 0,'' ,false ,undefined 都会在if那里判断为 false不利于代码阅读
}
}
return newArr;
}
var list = [1, 2, 2, 3, 4, '3', '3', NaN, NaN, false, false, true, true];
console.log(noRepeat(list), '去重后')//[1, 2, 3, 4, "3", NaN, false, true] "去重后"
</script>
4.先排序再去重
<script type="text/javascript">
var list = [1, 2, 3, 3, '0', '0', '2', '测试', '测试', NaN, NaN, false, false];
function noRepeat(arr) {
arr.sort();
var temp = [];
while(arr.length > 0) {
if(Object.is(arr[0], arr[1])) { //Object.is() 用于比较2个值, 比===更靠谱 例如 Object.is(NaN,NaN) 会判断true
arr.shift();
} else {
temp.push(arr.shift());
}
} //此方法会清空原数组,可以复制一个数组,再进行操作
return temp
}
console.log(noRepeat(list), '去重后')//["0", 1, 2, "2", 3, NaN, false, "测试"] "去重后"
</script>
5.for in + array.includes(ES6判断)
<script type="text/javascript">
var arr = [1,3, 3, '1', '1', '1','重复', '重复', NaN, NaN, false, false,undefined,undefined];
function noRepeat(arr) {
var temp = [];
for(var i = 0; i < arr.length; i++) {
if(!temp.includes(arr[i])) { //includes检测数组是否有某个值 内部调用Object.is()利用判断NaN
temp.push(arr[i]);
}
}
return temp
}
console.log(noRepeat(arr), '去重后'); //[1, 3, "1", "重复", NaN, false, undefined] "去重后"
</script>
js数组去重方法包括Es6(方法有很多,但是需要考虑兼容性和数据类型场景)的更多相关文章
- js数组去重的4种方法
js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...
- JS数组去重的9种方法(包括去重NaN和复杂数组类型)
其实网上已经有很多js数组的去重方法,但是我看了很多篇并自己通过代码验证,发现都有一些缺陷,于是在研究多篇代码之后,自己总结了9种方法,如果有哪里不对请及时纠正我哈~ 转载请表明出处 测试代码 let ...
- js数组去重的几种方法
1.遍历数组法 最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持 ...
- js数组去重的4个方法
面试前端必须准备的一个问题:怎样去掉Javascript的Array的重复项, 这个问题看起来简单,但是其实暗藏杀机. 考的不仅仅是实现这个功能,更能看出你对计算机程序执行的深入理解. 我总共总结4种 ...
- js数组去重的三种常用方法总结
第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中 Array.p ...
- Js 数组去重的几种方法总结
去重是开发中经常会碰到的一一个热点问题,不过目前项目中碰到的情况都是后台接口使用SQL去重,简单高效,基本不会让前端处理去重.那么前端处理去重会出现什么情况呢?假如每页显示10条不同的数 ...
- js数组去重的三种方法
<script type="text/javascript"> /*// 第一种冒泡法删除 var arr=[1,2,2,78,3,456,456]; for(var ...
- js 数组去重 的5种方法
一万数组,4个重复项,先贴上成绩. 1.3毫秒 2.115毫秒 3.71毫秒 4.6毫秒 1.哈希表 2.JQuery (最快的方法是用JQuery 这句话是截图带的... 实际上Jq是最慢的) 3. ...
- js 数组去重的三种方法(unique)
方法一: Array.prototype.unique=function(){ var arr=[];//新建一个临时数组 for(var i=0;i<this.length;i++){//遍历 ...
随机推荐
- bzoj3489
kdtree 3维kdtree,就是三个维度轮换着切,我们把每个元素看成一个点,坐标是上次出现的位置,下次出现的位置,自己的位置,第一个<l,第二个>r,第三个[l,r],然后kdtree ...
- js数组,在遍历中删除元素(用 for (var i in arr)是无效的 )
/** * 有效的方式 - 改变下标,控制遍历 */ for (var i = 0; i < arr.length; i++) { if (...) { arr.splice(i, 1); // ...
- Windows服务卸载服务窗口仍显示的问题
关于Windows服务通过命令卸载后, 打开服务窗口,服务还有显示,只是状态改为了禁用,运行停止.那么我们怎么解决呢, 不要心慌,打开你的任务管理器,查看服务所用的exe程序是否还在运行,若有的话,便 ...
- Python死锁与递归锁
Lock() 互斥锁会导致死锁,用RLock()递归锁代替. 递归锁:可以连续acquire多次,每acquire一次计数器+1(无论acquire的是哪个锁),只有计数为0才能被acquire mu ...
- 1-1 课程简介 & 2-1 IDEA与Eclipse的不同 & 2-3 Intellij IDEA安装
---恢复内容开始--- F:\教程\java-慕课\从网页搭建入门Java Web\Java web\步骤四:常用功能\1.IntelliJ IDEA开发工具入门 1-1 课程简介 2-1 IDEA ...
- 洛谷 - P5429 - Fence Planning - 并查集
https://www.luogu.org/problemnew/show/P5429 很明显是要维护整个连通块的共同性质,并查集一搞就完事了. #include<bits/stdc++.h&g ...
- unity 在移动平台中,文件操作路径详解
今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好.更快的掌握,当然,如有不足的地方 欢迎指正!!! 相信大家在开发过程中,难免会保存一些文件在 ...
- dosbox让DOSBox启动后自动执行命令——自动挂载
学习汇编时. 每次启动DOSBox后,都要挂载.转盘符,于是有一个骚套路. 找到这个:bat文件 用记事本就可以编辑. 拉到最下面,找到[autoexec]部分,补充命令如下: mount c f: ...
- Vue.js实战
指令 什么是指令 指令,directives,是vue非常常用的功能,在template里. 都是以v-开头 不是自己所为html元素,比如假设指令叫v-abc,没有这种写法,这是组件(compone ...
- Windows 2008 R2 如何安装.net framework 3.5
服务器中安装sql server2012 , 安装过程中提示没有此 “ Framework 3.5.1 功能 ” , 是不是很尴尬 于是简单记录安装 Framework 3.5.1 功能的步骤 一. ...