javascript数组去重的3种方法
前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!
方法一
//注意有一个元素是空的
var test1 = [0, 0, 1, 1, 2, 'sss', 2, , 3, 'abc', 3, 4, 4, 'sss', 'apple', 5, 5, 6, 7, 8, 9, function a() {}];
//第一种方法是遍历新数组newArr里有没有包含arr里的i项,如果没有则向newArr里添加arr[i]项,如果有则跳过
//需考虑indexOf()的兼容性问题
function arrayUnique1(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(arrayUnique1(test1)); //[0, 1, 2, "sss", undefined, 3, "abc", 4, "apple", 5, 6, 7, 8, 9, function]
方法二
var test2 = [0, 0, 1, 1, 2, 'sss', 2, , 3, 'abc', 3, 4, 4, 'sss', 'apple', 5, 5, 6, 7, 8, 9, function a() {}];
//先将数组进行排序,重复元素会在相邻位置
//拿原数组第i个和新数组的最后一个进行比较,如果不同,则将该元素存入新数组中
//该方法由于使用sort()方法,所以会改变数组顺序
function arrayUnique2(arr) {
arr.sort();
var newArr = [arr[0]];
for (var i = 1; i < arr.length; i++) {
if (arr[i] !== newArr[newArr.length - 1]) {
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(arrayUnique2(test2)); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "abc", "apple", function, "sss", undefined]
方法三
var test3 = [0, 0, 1, 1, 2, 'sss', 2, , 3, 'abc', 3, 4, 4, 'sss', 'apple', 5, 5, 6, 7, 8, 9, function a() {}];
//不太熟悉hash表,大概意思如下:
//遍历原数组,每次从原数组取出一个元素,然后到新对象中去访问这个属性,如果不能访问到值,则把它存放到新数组中,同时把这个元素作为一个属性,并赋值为true,存入到新建立的对象中。如果能访问到值,则说明重复; //访问对象的属性有两种方式 obj['attr'] 或者 obj.attr;
//当知道具体属性名时可以用obj.attr,如arr.length;当不确定属性名时,就要用obj['attr'];
//这两种方法区别上不大,都有对应的使用场景。点表示法一般作为静态对象使用时来存取属性。而数组表示法在动态存取属性时就非常有用。
function arrayUnique3(arr) {
var newArr = [],
hash = {};
for (var i = 0; i < arr.length; i++) {
if (!hash[arr[i]]) {
hash[arr[i]] = true;
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(arrayUnique3(test3)); //[0, 1, 2, "sss", undefined, 3, "abc", 4, "apple", 5, 6, 7, 8, 9, function]
方法四
const arr = [];
// 生成[0, 100000]之间的随机数
for (let i = 0; i < 100000; i++) {
arr.push(0 + Math.floor((100000 - 0 + 1) * Math.random()))
}
// ...实现算法
console.time('test');
let a = [...new Set(arr)].sort((a, b) => a - b)
console.log(a)
console.timeEnd('test');
console.log(arr.sort((a, b) => a - b))
方法五
const arr = [];
// 生成[0, 100000]之间的随机数
for (let i = 0; i < 100000; i++) {
arr.push(0 + Math.floor((100000 - 0 + 1) * Math.random()))
} Array.prototype.unique = function () {
const tmp = new Map();
return this.filter(item => {
return !tmp.has(item) && tmp.set(item, 1);
})
} // ...实现算法
console.time('test');
console.log(arr.unique().sort((a, b) => a - b))
console.timeEnd('test');
console.log(arr.sort((a, b) => a - b))
javascript数组去重的3种方法的更多相关文章
- JavaScript数组去重的几种方法
这个老问题,网上普遍都有了,为什么要再写一遍呢,主要是为了记个笔记... 遍历时搜索结果数组 思路很明确,如下 新建一个数组存放结果 循环遍历原数组,对于每一个元素,在结果数组中搜索是否存在 若不存在 ...
- JavaScript数组去重的10种方法
「数组去重」的确是个老生常谈的问题了,但是你真正的掌握了吗?平时开发中是不是用最简单粗暴的方法来去重?注意到它的性能问题了吗?当面试官对你回答的四个去重方法都不满意时你可以想出更简单且性能能更好的方法 ...
- JavaScript数组去重的四种方法
今天,洗澡的想一个有趣的问题,使用js给数组去重,我想了四种方法,虽然今天的任务没有完成,5555: 不多说,po代码: //方法一:简单循环去重 Array.prototype.unique1 ...
- [转] JavaScript数组去重(12种方法)
数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码.如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看.在真实的项目中碰到的数组去重,一般都是 ...
- JavaScript数组去重(12种方法,史上最全)
参考博客:https://segmentfault.com/a/1190000016418021?utm_source=tag-newest
- JavaScript中数组去重的几种方法
JavaScript中数组去重的几种方法 正常情况下,数据去重的工作一般都是由后端同事来完成的,但是前端也要掌握好处理数据的能力,万一去重的工作交给我们大前端处理,我们也不能怂呀.现在我总结了一些去重 ...
- js中数组去重的几种方法
js中数组去重的几种方法 1.遍历数组,一一比较,比较到相同的就删除后面的 function unique(arr){ ...
- JavaScript数组去重的7种方式
1.利用额外数组 function unique(array) { if (!Array.isArray(array)) return; let newArray = []; fo ...
- 关于数组去重的几种方法-------javascript描述
第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...
随机推荐
- Maven-04: 三套生命周期
Maven的生命周期不是一个整体,而是拥有三套相互独立的生命周期,它们分别是clean,default和site. clean生命周期的目的是清理项目. default生命周期的目的是构建项目. si ...
- Spring Boot 定时任务的使用
@Configuration @EnableScheduling public class ScheduleConfig { private final Logger logger = LoggerF ...
- 【treeview】 基于jQuery的简单树形插件
[treeview] 效果图: 前几天想把后台的目录结构通过树形插件的方法反映到前端来,在网上搜了半天只找到了这个treeview,虽然不是很好看,不过还是够用的..用treeview的前提是要有jq ...
- Axure RP初学
制作商品购买页
- @Cacheable的实现原理
如果你用过Spring Cache,你一定对这种配置和代码不陌生: <cache:annotation-driven cache-manager="cacheManager" ...
- alpha-咸鱼冲刺day1
一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花!) 四,问题 ...
- 20162318 实验二《Java面向对象程序设计》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年4月14日 实验密级:非密级 实验器材:带Lin ...
- 201621123050 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 ①foreach循环 for (String e : map.keyS ...
- 冲刺NO.8
Alpha冲刺第八天 站立式会议 项目进展 项目稳步进行,项目的基础部分如基本信息管理,信用信息管理等部分已相对比较完善. 问题困难 技术困难在短期内很难发生质的变化,而本项目由于选择了队员不太熟悉的 ...
- 安装QT5.02
1.下载QT5 SDK 下载地址:http://qt-project.org/downloads. 2.安装QT5 下载完后,假设放在Download/,切换到该目录,输入:./qt-linux-op ...