var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 'NaN', 0, 0, 'a', 'a', {}, {}];

/*
* ES3 的方法
*/ // 方法一 思路:新建空数组,利用双层for循环,逐一取出传入数组的项与新数组中的每一项做对比,如果没有相同的则将该项插入新数组中,如果对比项相同则跳出当前循环回到父循环中继续做下一轮对比。新数组为去重后的数组,不会影响老数组
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null。
// 缺点:不能过滤掉 NaN、Object
function unique1(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (newArr.length == 0) {
newArr.push(arr[i]);
} else {
var isPush = true;
for (var k = 0; k < newArr.length; k++) {
if (newArr[k] == arr[i]) {
isPush = false;
break;
};
};
if (isPush == true) {
newArr.push(arr[i]);
}
}
};
return newArr;
};
console.log(unique1(arr)); // [1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}] // 方法二 思路:新建空数组,利用双层for循环,将传入数组的项(从第一项开始)与其后面的项做对比,如果有相同的,不做处理,如果没有相同的,就插入到新数组中。新数组为去重后的数组,不会影响老数组
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null。
// 缺点:不能过滤掉 NaN、Object
function unique2(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
for (var k = i + 1; k < arr.length; k++) {
if(arr[k] == arr[i]){
k = ++i;
};
};
newArr.push(arr[i]);
};
return newArr;
};
console.log(unique2(arr)); // ["true", true, 15, null, NaN, NaN, "NaN", 0, "a", {…}, {…}] // 方法三 思路:双层for循环,让当前项与其后面的项做比较,如果相同,就对后面重复的项做删除操作,会影响老数组。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null。
// 缺点:不能过滤掉 NaN、Object
// 备注 示例方法是正向遍历,也可以逆向遍历,此处不做演示
function unique3(arr) {
for (var i = 0; i < arr.length; i++) {
for (var k = i + 1; k < arr.length; k++) {
if (arr[k] == arr[i]) {
arr.splice(k, 1);
k--;
}
}
}
};
unique3(arr)
console.log(arr); // [1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}] // 方法四 思路:利用对象的属性名字不能重复的特点,建立新对象,将数组中的某项作为属性名放到对象当中,使用for循环判断对象属性是否存在,如果存在,不进行操作,如果不存在则放置到对象中。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null、NaN、Object。
// 缺点:针对 NaN和'NaN', 对象的key会视为一个key,区分不了NaN和'NaN'。
function unique4(arr) {
var newObj = {},
newArr = [];
for (var i = 0; i < arr.length; i++) {
if (!newObj[arr[i]]) {
newObj[arr[i]] = true;
newArr.push(arr[i]);
}
}
return newArr;
};
console.log(unique4(arr)); // [1, "true", 15, false, undefined, null, NaN, 0, "a", {…}] // 方法五 思路:利用sort()方法先将数组排序,然后使用for循环遍历排序后的数组,如果当前项与其后面相邻的项不相同,则将该项插入新数组中,此方法不改变元素组,返回排序后的新数组。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null。
// 缺点:不能过滤掉 NaN、Object
function unique5(arr){
var sortArr = arr.sort(function(a, b){
return a - b;
});
var newArr = [sortArr[0]];
for(var i = 1; i< sortArr.length;i++){
if(sortArr[i] !== sortArr[i-1]){
newArr.push(sortArr[i]);
}
};
return newArr;
};
console.log(unique5(arr)); // [1, "true", false, null, 0, true, 15, {…}, {…}, NaN, NaN, "NaN", "a", undefined] // 方法六 思路:利用sort()方法先将数组排序,然后创建递归函数判断当前项与其后面的项是否相同,相同用splice方法删除,然后运行递归函数继续进行判断操作。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null。
// 缺点:不能过滤掉 NaN、Object
function unique6(arr) {
var newArr = arr,
arrLen = arr.length;
var sortArr = arr.sort(function(a, b) {
return a - b;
}); function loop(index) {
if (index >= 1) {
if (newArr[index] === newArr[index - 1]) {
newArr.splice(index, 1);
};
loop(index - 1);
}
};
loop(arrLen - 1);
return newArr;
};
console.log(unique6(arr)); // [1, "true", false, null, 0, true, 15, {…}, {…}, NaN, NaN, "NaN", "a", undefined] /*
* ES5的方法
*/ // 方法七 思路:结合indexOf()方法和forEach()方法,如果老数组中循环的项在新数组中不存在,则将该项插入新数组,不改变老数组,返回新数组。注意indexOf()方法也可以用lastIndexOf()方法替代,forEach()方法也可以用for循环替代的。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null。
// 缺点:不能过滤掉 NaN、Object
function unique7(arr){
var newArr = [];
// for(var i = 0; i< arr.length; i++){
// if(newArr.indexOf(arr[i]) === -1){
// newArr.push(arr[i]);
// }
// }
arr.forEach(function(item, index, array){
if(newArr.indexOf(item) === -1){
newArr.push(item);
}
});
return newArr;
};
console.log(unique7(arr)); // [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}] // 方法八 思路:结合includes()方法和forEach()方法,includes方法检测数组中是否有某个值。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null、NaN。
// 缺点:不能过滤掉Object
function unique8(arr){
var newArr = [];
arr.forEach(function(item, index, array){
if(!newArr.includes(item)){
newArr.push(item);
}
});
return newArr;
};
console.log(unique8(arr)); // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}] // 方法九 思路:结合includes()方法和filter()方法,includes方法检测数组中是否有某个值。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null、NaN。
// 缺点:不能过滤掉Object
function unique9(arr){
var newArr = [];
arr.filter(function(item){
if(!newArr.includes(item)){
newArr.push(item);
}
});
return newArr;
};
console.log(unique9(arr)); // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}] // 方法十 思路:结合indexOf()方法和filter()方法,includes方法检测数组中是否有某个值。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null。
// 缺点:不能过滤掉 NaN、Object
function unique10(arr){
var newArr = [];
arr.filter(function(item){
if(newArr.indexOf(item) === -1){
newArr.push(item);
}
});
return newArr;
};
console.log(unique10(arr)); // [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}] // 方法十一 思路:利用map()方法去重。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null、NaN。
// 缺点:不能过滤掉 Object
function unique11(arr){
var map = new Map();
var newArr = [];
arr.forEach(function(item){
if(map.has(item)){
map.set(item, true);
} else {
map.set(item, false);
newArr.push(item);
}
});
return newArr;
};
console.log(unique11(arr)); // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}] // // 方法十二 思路:利用hasOwnProperty去重。
// // 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null、NaN、Object。
function unique12(arr){
var obj = {};
return arr.filter(function(item){
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true);
});
};
console.log(unique12(arr)); // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}] /*
* ES6的方法
*/ // 方法十三 思路:利用ES6中的拓展运算符...和set()方法。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null、NaN。
// 缺点:不能过滤掉Object
function unique13(arr){
return [...new Set(arr)];
};
console.log(unique13(arr)); // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}] // 方法十四 思路:利用ES6中Array.from()方法和set()方法,set()方法可以生产set数据结构,这种结构成员的值是唯一的,然后用Array.from()方法将set对象转为数组。
// 优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null、NaN。
// 缺点:不能过滤掉Object
function unique14(arr){
return Array.from(new Set(arr));
};
console.log(unique14(arr)); // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

js 数组去重方法总结的更多相关文章

  1. js 数组去重方法汇总

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

  2. 原声js数组去重方法

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

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

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

  4. Js数组去重方法总结

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

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

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

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

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

  7. js数组去重方法整理

    1.思路:定义一个新数组,并存放原数组的第一个元素,然后将原数组的项和新数组的元素一一对比,若不同则存放在新数组中. function unique(arr){ var res = [arr[0]]; ...

  8. js数组去重方法集合

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

  9. js 数组去重方法

    var arr = ['a',1,2,3,'a',4,2,3,1,4,2,8,10,null,'a']; // 方法一 var newArr = [...new Set(arr)]; console. ...

随机推荐

  1. 如何在某些情况下禁止提交Select下拉框中的默认值或者第一个值(默认选中的就是第一个值啦……)

    群里有个帅哥问了这么个问题,他的下拉框刚进页面时是隐藏起来的,但是是有值的,为啥呢?因为下拉框默认选中了第一个值呗,,, 所以提交数据的时候就尴尬啦,明明没有选,但是还是有值滴.怎么办呢? 一开始看到 ...

  2. 【LuoguP4557】[JSOI2018]战争

    题目链接 题意 给你两个点集. q次询问 , 每次把其中一个点集往一个方向移动 , 问两个点集的凸包还有没有交. Sol 闵可夫斯基和板子题. 把问题做如下转换: 我们本来两个凸包相交是相当于是对于移 ...

  3. 【leetcode】1274. Number of Ships in a Rectangle

    题目如下: (This problem is an interactive problem.) On the sea represented by a cartesian plane, each sh ...

  4. Java三大体系JavaEE、JavaSE、JavaME的区别

    Java由四方面组成: ●Java编程语言,即语法. ●Java文件格式,即各种文件夹.文件的后缀. ●Java虚拟机(JVM),即处理*.class文件的解释器. ●Java应用程序接口(Java ...

  5. 随机验证码生成和join 字符串

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...

  6. Java多线程和并发(七),synchronized

    目录 1.线程安全的主要原因 2.互斥锁的特性 3.锁的类别 4.类锁和对象锁的总结 七.synchronized 1.线程安全的主要原因 2.互斥锁的特性 Java中synchronized锁的不是 ...

  7. 在百度ueditor上粘贴从word中copy的图片和文字 图片无法显示的问题

    我这边从world 里面复制粘贴图片到编辑器中,它自动给我上传了,但是我是用的第三方的要设置一个token值,我找了很久,也没有找到应该在哪里设置这个上传的参数,如果是点击图片上传,我知道在dialo ...

  8. 字符串之format整理

    format 用法 本文根据官方文档及自己理解整理,只整理出自己可以理解的部分,h因个人水平有限,难免有所错误和纰漏,欢迎批评指正. 格式{ [field_name] ["!" c ...

  9. python实现一个朴素贝叶斯分类方法

    1.公式 上式中左边D是需要预测的测试数据属性,h是需要预测的类:右边式子分子是属性的条件概率和类别的先验概率,可以从统计训练数据中得到,分母对于所有实例都一样,可以不考虑,所有只需 ,返回最大概率的 ...

  10. 图解数据库中的join操作

    1.所有的join都从cross join衍生而来 2.所有join图示 转自Say NO to Venn Diagrams When Explaining JOINs