1.思路:定义一个新数组,并存放原数组的第一个元素,然后将原数组的项和新数组的元素一一对比,若不同则存放在新数组中。

function unique(arr){
var res = [arr[0]];
for(var i=1; i<arr.length; i++){
var repeat = false;
for(var j=0; j<res.length; j++){
if(arr[i] === res[j]){
repeat = true;
break;
}
}
if(!repeat){
res.push(arr[i]);
}
}
return res;
}
console.log('------------方法一---------------');
console.log(unique([1,1,2,3,5,3,1,5,6,7,4]));

2.思路二:先将原数组排序,在与相邻的进行比较,如果不同则存入新数组。

function unique2(arr){
var arr2 = arr.sort();
var res = [arr2[0]];
for(var i=1; i<arr2.length; i++){
if(arr2[i] !== res[res.length-1]){
res.push(arr2[i]);
}
}
return res;
}
console.log('------------方法二---------------');
console.log(unique2([1,1,2,3,5,3,1,5,6,7,4]));

3.思路三:利用对象属性存在的特性,如果没有该属性则存入新数组。

function unique3(arr){
var res = [];
var obj = {};
for(var i=0; i<arr.length; i++){
if( !obj[arr[i]] ){
obj[arr[i]] = 1;
res.push(arr[i]);
}
}
return res;
}
console.log('------------方法三---------------');
console.log(unique3([1,1,2,3,5,3,1,5,6,7,4]));

4.思路四:利用数组的indexOf下标属性来查询。

function unique4(arr){
var res = [];
for(var i=0; i<arr.length; i++){
if(res.indexOf(arr[i]) == -1){
res.push(arr[i]);
}
}
return res;
}
console.log('------------方法四---------------');
console.log(unique4([1,1,2,3,5,3,1,5,6,7,4]));

5.思路五:利用数组原型对象上的includes方法。

function unique5(arr){
var res = [];
for(var i=0; i<arr.length; i++){
if( !res.includes(arr[i]) ){ // 如果res新数组包含当前循环item
res.push(arr[i]);
}
}
return res;
}
console.log('------------方法五---------------');
console.log(unique5([1,1,2,3,5,3,1,5,6,7,4]));

6.思路六:利用数组原型对象上的 filter 和 includes方法。

function unique6(arr){
var res = [];
res = arr.filter(function(item){
return res.includes(item) ? '' : res.push(item);
});
return res;
}
console.log('------------方法六---------------');
console.log(unique6([1,1,2,3,5,3,1,5,6,7,4]));

7.思路七:利用数组原型对象上的 forEach 和 includes方法。

function unique7(arr){
var res = [];
arr.forEach(function(item){
res.includes(item) ? '' : res.push(item);
});
return res;
}
console.log('------------方法七---------------');
console.log(unique7([1,1,2,3,5,3,1,5,6,7,4]));

8.思路八:利用数组原型对象上的 splice 方法。

function unique8(arr){
var i,
j,
len = arr.length;
for(i = 0; i < len; i++){
for(j = i + 1; j < len; j++){
if(arr[i] == arr[j]){
arr.splice(j,1);
len--;
j--;
}
}
}
return arr;
}
console.log('------------方法八---------------');
console.log(unique8([1,1,2,3,5,3,1,5,6,7,4]));

9.思路九:利用数组原型对象上的 lastIndexOf 方法。

function unique9(arr){
var res = [];
for(var i=0; i<arr.length; i++){
res.lastIndexOf(arr[i]) !== -1 ? '' : res.push(arr[i]);
}
return res;
}
console.log('------------方法九---------------');
console.log(unique9([1,1,2,3,5,3,1,5,6,7,4]));

10.思路十:利用 ES6的set 方法。

function unique10(arr){
//Set数据结构,它类似于数组,其成员的值都是唯一的
return Array.from(new Set(arr)); // 利用Array.from将Set结构转换成数组
}
console.log('------------方法十---------------');
console.log(unique10([1,1,2,3,5,3,1,5,6,7,4]));

有意思的是,当我把数组的长度变得很大的时候,测试了一下不同方法的执行时间长短,会发现方法三、四、五、六、七相对来说会更有优势,而方法八的执行速度似乎一直垫底。你也可以在你本地跑一下试试!

var time3 = new Date().getTime();
function unique3(arr){
var res = [];
var obj = {};
for(var i=0; i<arr.length; i++){
if( !obj[arr[i]] ){
obj[arr[i]] = 1;
res.push(arr[i]);
}
}
return res;
}
console.log('------------方法三---------------');
console.log( unique3(arr) );
console.log('3所花时间: ' + (new Date().getTime() - time3));

以上内容引自https://www.jb51.net/article/121410.htm,整理方便自己翻看

js数组去重方法整理的更多相关文章

  1. JS实现数组去重方法整理

    前言 我们先来看下面的例子,当然来源与网络,地址<删除数组中多个不连续的数组元素的正确姿势> 我们现在将数组中所有的‘ a’ 元素删除: var arr = ['a', 'a', 'b', ...

  2. js 数组去重方法汇总

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  3. 原声js数组去重方法

    数组去重方法 方法一 ---- 利用数组filter + indexOf方法去重 方法二 ---- 利用数组forEach + indexOf方法去重 方法三 ---- 利用数组from方法 + Se ...

  4. js数组去重方法分析与总结

    数组去重经常被人拿来说事,虽然在工作中不常用,但他能够很好的考察js基础知识掌握的深度和广度,下面从js的不同阶段总结一下去重的方法. ES3阶段 该阶段主要通过循环遍历数组从而达到去重的目的 多次循 ...

  5. Js数组去重方法总结

    //方法一 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; function removeDuplicatedItem(arr) { for(var i = 0; ...

  6. 三种常用的js数组去重方法

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中 Array.pro ...

  7. js数组去重方法包括Es6(方法有很多,但是需要考虑兼容性和数据类型场景)

    1.Es6提供的方法 <script type="text/javascript"> //ES6里新添加了两个方法,set(set是一种新的数据结构,它可以接收一个数组 ...

  8. js 数组去重方法总结

    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, ...

  9. js数组去重方法集合

    //第一种方法,新建一个空数组,将原来的数组循环逐个与新数组的成员做比较,如果新数组没有该元素就push进来 var arr = ['a', 1, 1, 1, 2, 4, 4, 'b', 'c', ' ...

随机推荐

  1. Java中Date()类 日期转字符串、字符串转日期的问题(已解决)

    Java中Date()类 日期转字符串.字符串转日期的问题 今天在写东西的时候突然发现一个问题,就是先new 一个Date()然后将生成的值转为字符串, 然后再将转换后的字符串再次用new Date( ...

  2. jquery.rotate.js可选抽奖次数和中奖内容的转盘抽奖demo

    需求: 最多可以抽奖5次,而且,每次只会中“2000元理财金”或者“谢谢参与”,其它的不会抽中(哈哈,果然都是套路). 效果如下: 一.页面结构: <div class="g-cont ...

  3. .net 写魔兽登录

    代码如下: 登录页面: public partial class FrmLogin : Form { public FrmLogin() { InitializeComponent(); } priv ...

  4. [PAMI 2018] Differential Geometry in Edge Detection: accurate estimation of position, orientation and curvature

    铛铛铛,我的第一篇文章终于上线了,过程曲折,太不容易了--欢迎访问--- https://ieeexplore.ieee.org/document/8382271/ 后面有需要的话可以更新一下介绍,毕 ...

  5. Flink -- Java Generics Programming

    Flink uses a lot of generics programming, which is an executor Framework with cluster of executor ha ...

  6. sqlServer拼结列字符串

    with table1(sessionID,message,createTime)as(select 1 ,'hello' ,'2014/5/6' union allselect 1 ,'word' ...

  7. HttpWebResponse对gzip格式返回结果的处理

    HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); HttpWebRes ...

  8. Android学习——Fragment与Activity通信(一)

    学会了在Activity中加载Fragment的方法之后,接下来便需要学习Activity和Fragment之间的通信.这一节先学习如何把Activity中的信息传递给Fragment. 基本过程 在 ...

  9. java面试之----堆(heap)、栈(stack)和方法区(method)

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method)也叫静态存储区. 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的 ...

  10. C#操作CAD-读取和修改数据

    我们操作cad最主要的目的就是读取和修改或者删除数据,因为内容较多,在此我们先讲一下基础,后续慢慢讲解. 1.cad数据读取和修改前都要进行锁定操作,以避免一个文档被多个用户修改而发生冲突. Data ...