数组去重的12种方法总结
数组去重的11种方法
(1)ES5常用:利用for嵌套for,然后splice去重
function unique(arr) {for (var i = 0; i < arr.length; i++) {for (var j = i + 1; j < arr.length; j++) {if (arr[i] == arr[j]) { //第一个等同于第二个,splice方法删除第二个arr.splice(j, 1);j--;}}}return arr;}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:两个null消失,NaN和{}没有去重
(2)ES6常用:Set去重
function unique(arr) {return Array.from(new Set(arr))}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:去重代码少。但是无法去除{}空对象。
(3)indexOf去重
function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}var array = [];//新建空数组,for循环原数组,判断数组是否存在当前元素,如果相同的值跳过,不同push进数组for (var i = 0; i < arr.length; i++) {if (array.indexOf(arr[i]) === -1) {array.push(arr[i])}}return array;}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:NaN、{}没有去重
(4)sort()排序
//排序后的结果,遍历对比function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}arr = arr.sort()var arrray = [arr[0]];for (var i = 0; i < arr.length; i++) {if (arr[i] !== arr[i - 1]) {arrray.push(arr[i]);}}return arrray}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:NaN、{}没有去重
(5)对象属性不能相同(不建议)
function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}var array = [];var obj = {};for (var i = 0; i < arr.length; i++) {if (!obj[arr[i]]) {array.push(arr[i])obj[arr[i]] = 1} else {obj[arr[i]]++}}return array;}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:两个true去掉,NaN和{}没有去重
(6)includes()
function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}var array = [];for (var i = 0; i < arr.length; i++) {if (!array.includes(arr[i])) { //includes 检测数组是否有某个值array.push(arr[i]);}}return array}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:{}没有去重
(7)hasOwnProperty
function unique(arr) {var obj = {};return arr.filter(function(item, index, arr){return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)})
}
解析:所有都去重
(8)filter
function unique(arr) {return arr.filter(function (item, index, arr) {//当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素return arr.indexOf(item, 0) === index;});}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:{}没有去重、NaN两个都没有了
(9)利用递归去重
function unique(arr) {var array = arr;var len = array.length;array.sort(function (a, b) { //排序后更加方便去重return a - b;})function loop(index) {if (index >= 1) {if (array[index] === array[index - 1]) {array.splice(index, 1);}loop(index - 1); //递归loop,然后数组去重}}loop(len - 1);return array;}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr))
解析:NaN和{}没有去重
(10)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;}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(arrayNonRepeatfy(arr))
解析:创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。{}空对象无法去重。
(11)reduce+includes
function unique(arr) {return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);}var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];console.log(unique(arr));
解析:{}无法去重
数组去重的12种方法总结相关推荐
- JS----JavaScript数组去重(12种方法,史上最全)
数组去重的方法 一.利用ES6 Set去重(ES6中最常用) Set 不包含重复元素的值的集合 Map 双列集合 键值对 与object的区别 : object中的key只能是string类型 而Ma ...
- java hashmap 去重_java数组去重的两种方法
我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...
- 两个对象数组去重的3种方法
两个对象数组去重的3种方法 前言 问题描述 解决方案一 解决方案二 解决方案三 前言 前段时间写过JavaScript数组去重最简单的 4 种方案,里面的数组元素是基本类型.本文要讲的数组元素是对象, ...
- java数组去重方法是,java数组去重的两种方法
我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...
- JavaScript数组去重的五种方法
JavaScript数组去重的五种方法 先简单准备一个数组,用于方法的实验: let array = [1,1,2,3,4,4,1,5,6,6,7,7,7]; console.log(`去重前的数组: ...
- 数组去重--这几种方法够不?
数组去重,是校招面试的必考知识点.简单的说,数组去重就是将一个数组中的相同的元素删除,只保留其中的一个.这里的相同其实是一个陷阱,有好多同学只认为值相等即为相同,而忽略类类型的判断.所以大家在进行数组 ...
- Js中数组去重的几种方法
前几天在看前端面试题的时候,其中js部分有个问题是实现数组去重的算法,一开始就想了一两种方法,后来仔细回忆了下这个题,觉得该问题实现方法确实不止局限于一两种方法 ,从不同的角度去看待该问题就会有多种实 ...
- js数组 去重的5种方法
// 数组去重 var arr = [1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 4, 3, 5, 7, 11, 12, 11]; var newArr = [];//方法1最优 se ...
- 原生JS数组去重的几种方法
有时候我们做项目的时候往往会需要把数组里面一些重复的项去掉,但是原生JS有排序,有筛选等等,但是就是没有数组去重怎么办呢? 这能怎么办,自己手动实现嘛.(以下代码直接在原型上添加的的方法,为的就是和原 ...
最新文章
- ma应用、超级短线、分钟短线买卖和看盘心得
- python找水仙花数_Python一句代码实现找出所有水仙花数的方法
- 3.Factory Method 工厂方法模式(创建型模式)
- Oracle中NVARCHAR2与VARCHAR2的相互转换
- 遇到一个sql2000的问题,实在搞不懂了,求解决的办法?
- 在读博士一作发Nature,学校重奖50万!
- linux iptables 编译,Linux下编译安装iptables
- Linux 实操 —— 日志筛选操作(sed与wc命令介绍)
- 阿里云服务器被挖矿怎么解决
- 注册页面的JSON响应方式详细分析(与前端页面交互方式之一)
- matplotlib画折线图中文乱码解决
- Leetcode461Hamming Distance汉明距离
- java算法竞赛入门经典_算法竞赛入门经典笔记(1-3章)
- 录音软件行业调研报告 - 市场现状分析与发展前景预测
- 散列表--数据结构与算法之美--CH18、CH19、CH20
- Win11系统右键没有解压选项!!!???
- 远程为华为RH2288V3服务器安装vmware esxi5.1操作系统
- 1024程序员节之长沙吃货打卡
- android电视横竖屏切换在哪里,Android横竖屏切换总结
- 刷脸支付无人便利店的使用体验也更好了