1、ES6 : set

  注set的坑:

    类数组转为数组,ES6提供了Array.from的方式,但在ES5中,类数组可以通过[].sclice.call(likeArr)转换,但对set无效

      如:var a = new Set([1,1,2,3]);     [].slice.call(a)  -->  [];//得到空数组

    将set转为数组的方式可以为:Array.from(set)  ;    也可以为:var arr = [...set];//同样是es6的,解构方式。。。。

var arr = [1,2,3,3,2,3];

//第一个方案:Set
//Array.from:将类数组对象转为数组
var arr1 = Array.from(new Set(arr)); console.log("方法二:"+arr1);// [1,2,3]

2、for循环,创建新数组

var unique = function(arr){
if(Object.prototype.toString.call(arr)=='[object Array]'){//类型判断
var newArr = [];
for(let i=0,len=arr.length;i<len;i++){
if(newArr.indexOf(arr[i]) < 0){//不存在
newArr.push(arr[i]);
}
}
return newArr;
}else{
return arr;
}
}

3、使用对象的键值属性

function unique2(arr) {
if (Object.prototype.toString.call(arr) !== '[object Array]') return arr; var obj = {};
var newArr = [],type,val;
for(var i=0,len=arr.length;i<len;i++){
val = arr[i],type = typeof val;
if(!obj[val]){//对象中没相应的键值,添加键值,同时赋值类型
obj[val] = [type];
newArr.push(val);
}else if(obj[val].indexOf(type)<0){//
//对象中有键值,但键值中的值对应type和数组元素type不一致,
//此时判断键值的对应值,原因为:
//a[1] 和a["1"]取出来是一样的,所以需要区分1和”1“
obj[val].push(type);
newArr.push(val);
}
}
return newArr;
}
var arr = [1,2,3,3,2,3,4,5,3];
var arr1 = ["1",1,2,"2",3,2];
console.log("第三种方式1:"+unique2(arr));//得到[1,2,3,4,5]
console.log("第三种方式2:"+unique2(arr1));//得到["1", 1, 2, "2", 3]

4、判断数组下标

//判断数组下标
var unique3 = function(arr){
if (Object.prototype.toString.call(arr) !== '[object Array]') return arr;
var newArr = [];
for(var i=0,len=arr.length;i<len;i++){
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if(arr.indexOf(arr[i])==i){
newArr.push(arr[i]);
}
}
return newArr;
}

5、排序后,给新数组逐个添加,并在添加前判断,新数组中的最后一个是否相等,注意此处一定为全等

// 将相同的值相邻,然后遍历去除重复值
function unique4(array){
array.sort(); //排序后,相同的值就会排在一起
var re=[array[0]];
for(var i = 1; i < array.length; i++){
if( array[i] !== re[re.length-1]){ //每次添加比较新数组的最后一个
re.push(array[i]);
}
}
return re;
}

js的去重的更多相关文章

  1. js数组去重的4种方法

    js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...

  2. JS 数组去重(数组元素是对象的情况)

    js数组去重有经典的 几种方法 但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现. 因为: 1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致 ...

  3. js数组去重常用方法

    js数组去重是面试中经常会碰到的问题,无论是前端还是node.js数组常见的有两种形式,一种是数组各元素均为基本数据类型,常见的为数组字符串格式,形如['a','b','c'];一种是数组各元素不定, ...

  4. js 数组去重小技巧

    js 数组去重小技巧 Intro 今天遇到一个问题,需要对数据进行去重,想看一下有没有什么比较方便的方法,果然有些收获. Question 问题描述: 我有一个这样的数据: [ { "Pro ...

  5. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  6. js数组去重五种方法

    今天来聊一聊JS数组去重的一些方法,包括一些网上看到的和自己总结的,总共5种方法(ES5). 第一种:遍历数组法 这种方法最简单最直观,也最容易理解,代码如下: var arr = [2, 8, 5, ...

  7. js数组去重的方法(转)

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  8. js字符串去重

    js字符串去重: 1.  去掉字符串前后所有空格: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } ...

  9. js 数组去重方法汇总

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

  10. js数组去重 javascript版

    //js数组去重 //思路: // 1.放入第一个元素 // 2.放入第n个元素,和第n个之前的元素就行比较,如果有重复,则跳过.没有重复就加入数组中 // 3.返回新的去重后数组 Array.pro ...

随机推荐

  1. vue的一些感想

    如今vue2.0是主流,但是它的路由确实直接从1.0过来的,其中包括组件包括全局组件和局部组件,写好组件之后,我们就需要 使用路由,将组件关联起来,关联起来之后,然后我们才可以将组件的内容通过hash ...

  2. 记账本微信小程序开发四

    学习添加组件 集成日期组件 添加组件 需要在main.js文件中,声明一个data值date与wxml中的{{date}}绑定关联,然后在onLoad中初始化字符串格式的日期值, 处理日期组件点击确认 ...

  3. Nginx优化详解-------超详细

      一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cp ...

  4. C++的重载操作符(operator)介绍(转)

    本文主要介绍C++中的重载操作符(operator)的相关知识. 1. 概述 1.1 what operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将 ...

  5. lmbench用于arm测试

    一.下载 http://www.bitmover.com/lmbench/lmbench.html网站有lmbench的介绍 下载地址如下(lmbench3): http://www.bitmover ...

  6. Splay详解

    平衡树实际很简单的 以下讲解都以Luogu P3369 [模板]普通平衡树为例 我不会带指针的Splay,所以我就写非指针型的Splay Splay是基于二叉查找树(bst)实现的 什么是二叉查找树呢 ...

  7. flask --- 04 . 偏函数, 线程安全,栈堆,

    一.偏函数(partial) ①第一种 结果为: ② 第二种 二.线程安全 将空间转换成时间 问题: 1秒钟打印所有结果 threading.current_thread().ident :线程ID ...

  8. CF438E The Child and Binary Tree

    思路 设F(x)的第x项系数为权值和为x的答案 题目中要求权值必须在集合中出现,这个不好处理,考虑再设一个C,C的第x项如果是1代表x出现在值域里,如果是0,代表x没有出现在值域里,然后由于二叉树可以 ...

  9. 【Mac AndroidStudio】download gradle fail问题

    第一次运行application时,会发现一直在download gradle,而且进度一直卡着.这时,可以直接拷贝download的链接,粘贴到浏览器下载.下载完了.然后,可以用命令行在用户目录下o ...

  10. 模块——Getopt::Long接收客户命令行参数和Smart::Comments输出获得的命令行参数内容

     我们在linux常常用到一个程序需要加入参数,现在了解一下 perl 中的有关控制参数的模块 Getopt::Long ,比直接使用 @ARGV 的数组强大多了.我想大家知道在 Linux 中有的参 ...