let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
/ 该方法最佳
// 该hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性作为其自己的属性
// const object1 = new Object();
// object1.property1 = 42;
// console.log(object1.hasOwnProperty('property1'));
// // expected output: true
// console.log(object1.hasOwnProperty('toString'));
// // expected output: false
// console.log(object1.hasOwnProperty('hasOwnProperty'));
// // expected output: false
// 该方法与第二种使用的indexOf的特性有异曲同工之妙,同样是用filter做过滤,判断当前obj是否有遍历的参数
// 没有就添加进去,有的话就跳过
function unique4(params) {
let obj = {};
return arr.filter((item,index,arr)=>{
return obj.hasOwnProperty(typeof item + item)?false:(obj[typeof item + item] = true)
})
}
console.log(unique4(arr))
// 利用ES6 set 去重
function unique1(arr) {
return Array.from(new Set(arr))
}
console.log(unique1(arr))
// Array.from() 方法从一个类似数组或可迭代对象中创建一个新的数组实例。
// console.log(Array.from('foo'));
// expected output: Array ["f", "o", "o"]
// console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]
// Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。下边是地址
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set
// 数组去重
// 方法。 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
// 利用indexOf 检索的字符串值没有出现,则该方法返回 -1。
function unique2(params) {
let temp = [];
let len = params.length;
for(let i = 0; i < len; i++) {
if(temp.indexOf(params[i]) === -1) {
temp.push(params[i]);
}
}
return temp;
}
console.log(unique2(arr))
// item 必须。当前元素的值 index  可选。当前元素的索引值 arr可选。当前元素属于的数组对象
 
// 特别点:利用filter作为for循环,使用indexOf(item,0)拿到当前索引的下标,做对比
function unique3(params) {
return params.filter((item,index,arr)=>{
return arr.indexOf(item,0) === index;
})
}
console.log(unique3(arr))
 
// includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
// var array1 = [1, 2, 3];
// console.log(array1.includes(2));
// expected output: true
// var pets = ['cat', 'dog', 'bat'];
// console.log(pets.includes('cat'));
// expected output: true
// console.log(pets.includes('at'));
// expected output: false
function unique5(params) {
// if(!Array.isArray(arr)) { // 用于确定传递的值是否是一个 Array。
// console.log('type error');
// return
// }
let array = [];
let len = params.length;
for(let i = 0; i < len; i++) {
if(!array.includes(arr[i])) {
array.push(arr[i]);
}
}
return array;
}
console.log(unique5(arr))
// 该reduce()方法在数组的每个成员上执行reducer函数(您提供),从而生成单个输出值。
const array1 = [1, 2, 3, 4];
// const reducer = (accumulator, currentValue) => accumulator + currentValue;
// 1 + 2 + 3 + 4
// console.log(array1.reduce(reducer));
// expected output: 10
// 5 + 1 + 2 + 3 + 4
// console.log(array1.reduce(reducer, 5));
// expected output: 15
// 该方法的思路依然是reduce作循环,利用includes判断是否有这个参数,没有的话就放进返回数组里
function unique6(params) {
return params.reduce((prev,cur)=> prev.includes(cur)? prev: [...prev,cur],[]);
}
console.log(unique6(arr));
// set() 方法为 Map 对象添加或更新一个指定了键(key)和值(value)的(新)键值对。
// has()返回一个布尔值,指示项是否存在具有指定键的项。
// 思路:首先在空的map实例中判断是否有当前Boolean值,如有没有进入else
// 将当前值存入map,再当前值push进入array,
// 如果当前值存在map里,就将当前值再放入map中
function unique7(params) {
let map = new Map();
let array = new Array();
let len = params.length;
for(let i = 0; i < len; i++) {
if(map.has(params[i])) {
map.set(params[i], true)
}else {
map.set(params[i], false)
array.push(params[i])
}
}
return array;
}
console.log(unique7(arr));
// 该sort()方法对数组中的元素进行排序并返回该数组。默认排序顺序是在将元素转换为字符串,
// 然后比较它们的UTF-16代码单元值序列时构建的。
// 由于它取决于实现,因此无法保证排序的时间和空间复杂性
function unique8(params) {
// if(!Array.isArray(params)) {
// console.log('type error!')
// return;
// }
params = params.sort();
let array = [params[0]];
let len = params.length;
for(let i = 1; i < len; i++) {
if(params[i] !== arr[i-1]) {
array.push(arr[i])
}
}
return array;
}
console.log(unique8(arr));//NaN、{}没有去重
 
function unique9(params){
for(let i=0; i<params.length; i++){
for(let j=i+1; j<params.length; j++){
if(params[i]==params[j]){ //第一个等同于第二个,splice方法删除第二个
params.splice(j,1);
j--;
}
}
}
return params;
}
console.log(unique9(arr));//NaN、{}没有去重
 
 
 
 
参考地址: https://segmentfault.com/a/1190000016418021

js 数组去重的几种方式及原理的更多相关文章

  1. JS 数组去重的几种方式

    JS 常见的几种数组去重方法 一.最简单方法(indexOf 方法) 实现思路:新建一个数组,遍历要去重的数组,当值不在新数组的时候(indexOf 为 -1)就加入该新数组中: function u ...

  2. js数组去重的三种方式的比较

    做前端的,一般实现功能是主要的,但是重中之重却是在做到功能完善的情况下提高性能. 1.遍历数组法 实现的思路:构建一个新的数组存放结果,for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组 ...

  3. js数组去重的四种方式

    // 删除重复的 function only(arr){ for(var i=0;i<arr.length;i++){ for(var j = i+1;j<arr.length;j++){ ...

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

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

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

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

  6. JS数组去重的6种算法实现

    1.遍历数组法 最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方法 ...

  7. JavaScript数组去重的7种方式

    1.利用额外数组 function unique(array) {    if (!Array.isArray(array)) return;     let newArray = [];    fo ...

  8. JS数组去重的9种方法(包括去重NaN和复杂数组类型)

    其实网上已经有很多js数组的去重方法,但是我看了很多篇并自己通过代码验证,发现都有一些缺陷,于是在研究多篇代码之后,自己总结了9种方法,如果有哪里不对请及时纠正我哈~ 转载请表明出处 测试代码 let ...

  9. js数组去重的几种方法

    1.遍历数组法 最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持 ...

随机推荐

  1. Confluence 6 指派和撤销空间权限

    指派空间权限 希望添加一个新用户或者用户组到权限列表中,从希望选择的选项中查找用户组或者用户,然后选择 添加(Add).用户和用户组将会显示在列表中:选择你希望引用的权限,然后选择 保存所有(Save ...

  2. MySQL事务(三)

    一.事务(Innodb锁)的隔离级别概述 并发事务带来的问题: 更新丢失(lost update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会 ...

  3. 廖雪峰网站:学习python函数—递归函数(四)

    # 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数 # 计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: # fact ...

  4. 『MXNet』专题汇总

    MXNet文档 MXNet官方教程 持久化模型 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四 ...

  5. Leetcode 120

    class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { ) ][]; tr ...

  6. Alibaba Java Coding Guidelines

    阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的<阿里巴巴Java开发规约>扫描插件!该插件由阿里巴巴P3C项目组研发.P3C是世界知名的反潜机,专门对付水下潜水艇,寓意是扫描出 ...

  7. JDK的bin目录下各种工具的使用说明_对不起自己,这么久没写博,抱歉

    appletviewer.exe(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器 apt.exe:SolarisTM 操作系统和 Linux上用于处理注释的工具 extche ...

  8. 13. Roman to Integer C++

    直接for循环,并且判断是否出现IV等情况 int which(char ch) { if(ch == 'I') ; else if(ch == 'V') ; else if(ch == 'X') ; ...

  9. set集合深浅拷贝以及知识补充

    一. 对之前的知识点进行补充. 1. str中的join方法. 把列表转换成字符串 li = ["李嘉诚", "麻花藤", "黄海峰", & ...

  10. httpd.conf文件格式解析

    apache http server,俗称apache,程序名httpd,默认配置文件/etc/httpd/conf/httpd.conf:该文件通过其中的Include conf.d/*.conf指 ...