6种萌新必备数组去重 + 扩展方法
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log('原数组', arr)
/* 那为什么没有去除空对象呢?
这是因为当两个值比较的值都是对象的时候,比较的是两个对象在内存中是否指向的是同一个地址。所以, */
// 方法一 利用Es6的Set集合,Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
function unique_1(v) {
return Array.from(new Set(v))
}
console.log('1.', unique_2(arr))
// 方法二 严格来说并不算是一种去重方法,相对于第一种方法来说只是简化了代码
function unique_2(v) {
return [...new Set(v)]
}
console.log('2.', unique_2(arr))
// 方法三 新建一个空的结果数组,利用 indexOf 来查找数组中是否已经存在该元素,如果存在该值跳过,如果不存在(-1)就push进新数组
function unique_3(v) {
if (!Array.isArray(v)) {
return
}
let newArr = []
v.forEach(element => {
// console.log(element)
if (newArr.indexOf(element) === -1) {
newArr.push(element)
}
});
return newArr
}
console.log('3', unique_3(arr))
// 方法四 与indexOf属于异曲同工之妙
/*
注意:因为NaN 与任何值(包括其自身)相比得到的结果均是 false
所以 indexOf 无法判断出NaN类型 indexOf(NaN)是一定会返回-1的 <---不懂可以去查一下indexOf 原理
*/
function unique_4(v) {
if (!Array.isArray(v)) {
return
}
return v.filter((item, index) => {
return v.indexOf(item) === index
})
}
console.log('4.', unique_4(arr))
// 方法五 利用 includes 方法 (检测数组是否包含指定值,包含返回true,不包含返回false)
// 没什么好说的,看懂 indexOf这个自然就懂了,我把他们放在一起,就是为了大家明白
function unique_5(v) {
if (!Array.isArray(v)) {
return
}
let newArr = []
v.forEach(element => {
if (!newArr.includes(element)) {
newArr.push(element)
}
})
return newArr
}
console.log('5.', unique_5(arr))
// 方法六 ES5常用双重for循环,然后splice去重,但是我们现在有更高效的方法了,不是吗?
var arr2 = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
function unique_6(v) {
if (!Array.isArray(v)) {
return
}
for (let i = 0; i < v.length; i++) {
for (let j = i + 1; j < v.length; j++) {
if (v[i] == v[j]) {
v.splice(j, 1)
j--;
}
}
}
/* 不懂看这里,
例:循环数组 arr = [66,66,33,66]
arr[0] == arr[1] 等于 66 == 66 等于 true
执行arr.splice(1, 1) <----再不懂百度去
然后现在数组变成了 [66,33,66] 继续下一轮循环
*/
return v
}
console.log('6.', unique_6(arr2))
执行结果
扩展方法
// 方法七 比较不错的一种去重方法,[所有格式的值都可以实现去重]
function unique_7(v) {
var obj = {};
return arr.filter(function(item, index, arr) {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
console.log('7.', unique_7(arr))
// 方法八 利用递归去重 不太好用,知道有这个玩意就行了
function unique_8(arr) {
var array = arr;
var len = array.length;
array.sort(function(a, b) { //排序后更加方便去重
return a - b;
})
function loop(index) {
if (index >= 1) {
if (array[index] === array[index - 1]) {
array.splice(index, 1);
}
loop(index - 1); //递归loop,然后数组去重
}
}
loop(len - 1);
return array;
}
console.log('8.', unique_8(arr))
我是巴依,各位后浪们加油!
FE-lnterview javascript 74
版权声明:本文为qq_42044542原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。