您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

JS数组去重的几种方式

时间:2019-08-09 10:52:36  来源:  作者:

1、利用 indexOf() 方法之一

Array.prototype.unique = function(){
 var temp = [];
 for (var i = 0;i < this.length;i++){
 // 如果当前数组的第 i 项已经保存到了临时数组,那么跳过
 if(temp.indexOf( this[i] ) == -1){
 temp.push( this[i] );
 }
 }
 return temp;
}

2、利用 indexOf() 方法之二

Array.prototype.unique = function(){
 var temp = [ this[0] ];
 for (var i = 1;i < this.length;i++){
 // 如果当前数组元素在数组中第一次出现的位置不是i,说明是重复元素
 if(this.indexOf( this[i] ) == i){
 temp.push( this[i] );
 }
 }
 return temp;
}

3、优化遍历数组法

Array.prototype.unique = function(){
 var hash=[];
 // 双层循环,外循环表示从 0 到 arr.length
 for (var i = 0; i < this.length; i++) {
 // 内循环表示从 i+1 到 arr.length
 for (var j = i+1; j < this.length; j++) {
 if(this[i]===this[j]){
 // 检测到有重复值时终止当前循环同时进入外层循环的下一轮判断
 ++i;
 }
 }
 // 将没重复的右边值放入新数组
 hash.push(this[i]);
 }
 return hash;
}

4、排序后再进行数组去重

Array.prototype.unique = function(){
 this.sort(function( a,b ){ return a-b; });
 var temp = [ this[0] ];
 for (var i = 0;i < this.length;i++){
 if( this[i] != this[i-1]){
 temp.push( this[i] );
 }
 }
 return temp;
}

5、利用数组 filter 方法过滤

Array.prototype.unique = function unique() {
 var res = this.filter(function(item, index, array) {
 return array.indexOf(item) === index;
 });
 
 return res;
}

6、利用对象属性的唯一性

Array.prototype.unique = function(){
 var temp = [],hash = {}; // hash 作为哈希表
 for (var i = 0;i < this.length;i++){
 if(!hash[ this[i] ]){ // 如果哈希表中没有当前项
 hash[ this[i] ] = true;
 temp.push(this[i])
 }
 }
 return temp;
}

7、利用 ES6 set 数据结构

Array.prototype.unique = function(){
 return Array.from(new Set(this));
}

上述七种方法中,经测试(测试数组元素个数从 1 万个- 1000 万个),代码运行速度从上到下依次降低,其中方法 1 和方法 2 速度差异不大,速度最慢,方法 3 的具体运行速度和数组具体情况相关,方法 4 速度比方法 1,2,3 快,但比方法 5,6,7 慢得比较多,方法 5,6,7 运行速度最快,且运行速度差异不大,不过鉴于 set 是 ES6 新加内容,在实际开发环境中,推荐使用稳定性和速度都比较不错的方法 5 和方法 6 。

拓展:若重复,则去掉该元素

function unique(arr){
 var hash=[];
 for (var i = 0; i < arr.length; i++) {
 if(arr.indexOf(arr[i])==arr.lastIndexOf(arr[i])){
 hash.push(arr[i]);
 }
 }
 return hash;
}


Tags:JS数组   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
虽然只有一个字母之差,但用法却差很多,我今天就被坑了。var g=["a","b","c","d","e","f","y"];console.log(g.slice(2,5)); // 打印出来的是 c d econsole.log(g.splice(2,5))...【详细内容】
2019-08-15  Tags: JS数组  点击:(240)  评论:(0)  加入收藏
1、利用 indexOf() 方法之一Array.prototype.unique = function(){ var temp = []; for (var i = 0;i < this.length;i++){ // 如果当前数组的第 i 项已经保存到了临时数组,...【详细内容】
2019-08-09  Tags: JS数组  点击:(237)  评论:(0)  加入收藏
▌简易百科推荐
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === &#39;a&#39;) { b = true} else { b = false}// goodb = a === &#39;a&#39;2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Mason程    Tags:JavaScript   点击:(6)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  未来讲IT    Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
1. 检测一个对象是不是纯对象,检测数据类型// 检测数据类型的方法封装(function () { var getProto = Object.getPrototypeOf; // 获取实列的原型对象。 var class2type =...【详细内容】
2021-12-08  前端明明    Tags:js   点击:(23)  评论:(0)  加入收藏
作者:一川来源:前端万有引力 1 写在前面Javascript中的apply、call、bind方法是前端代码开发中相当重要的概念,并且与this的指向密切相关。本篇文章我们将深入探讨这个关键词的...【详细内容】
2021-12-06  Nodejs开发    Tags:Javascript   点击:(19)  评论:(0)  加入收藏
概述DOM全称Document Object Model,即文档对象模型。是HTML和XML文档的编程接口,DOM将文档(HTML或XML)描绘成一个多节点构成的结构。使用JavaScript可以改变文档的结构、样式和...【详细内容】
2021-11-16  海人为记    Tags:DOM模型   点击:(35)  评论:(0)  加入收藏
入口函数 /*js加载完成事件*/ window.onload=function(){ console.log("页面和资源完全加载完毕"); } /*jQuery的ready函数*/ $(document).ready(function(){ co...【详细内容】
2021-11-12  codercyh的开发日记    Tags:jQuery   点击:(36)  评论:(0)  加入收藏
一、判断是否IE浏览器(支持判断IE11与edge)function IEVersion() {var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isIE = userAgent.indexOf("comp...【详细内容】
2021-11-02  V面包V    Tags:Javascript   点击:(40)  评论:(0)  加入收藏
Null、Undefined、空检查普通写法: if (username1 !== null || username1 !== undefined || username1 !== &#39;&#39;) { let username = username1; }优化后...【详细内容】
2021-10-28  前端掘金    Tags:JavaScript   点击:(51)  评论:(0)  加入收藏
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化...【详细内容】
2021-10-18  前端达人    Tags:JS   点击:(51)  评论:(0)  加入收藏
带有多个条件的 if 语句把多个值放在一个数组中,然后调用数组的 includes 方法。// bad if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") { //logic } // be...【详细内容】
2021-09-27  羲和时代    Tags:JS   点击:(58)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条