JavaScript数组去重
发布时间:2021-12-31 00:02:55
数组去重方式,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?
一、利用Set去重
不考虑兼容性,这种去重的方法代码最少。
function distinct(arr) {
return Array.from(new Set(arr));
}
var arr = [1,'true',true,15,false,undefined,null,NaN,'NaN',0,'a',{},1,'true',true,15,false,undefined,null,NaN,'NaN', 0,'a',{}];
console.log(distinct(arr));
//输出结果:[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
//{} 无法去重
二、利用indexOf去重
新建一个空的结果数组,循环原数组判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则添加进数组。
function distinct(arr) {
var array = [];
for (var i = 0; i < arr.length; i++) {
if (array.indexOf(arr[i]) === -1) {
array.push(arr[i]);
}
}
return array;
}
var arr = [1,'true',true,15,false,undefined,null,NaN,'NaN',0,'a',{},1,'true',true,15,false,undefined,null,NaN,'NaN', 0,'a',{}];
console.log(distinct(arr));
//输出结果:[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, NaN, {}]
//NaN、{} 无法去重
三、利用sort()
利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对。
function distinct(arr) {
arr = arr.sort();
var arrry= [arr[0]];
for (var i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i-1]) {
arrry.push(arr[i]);
}
}
return arrry;
}
var arr = [1,'true',true,15,false,undefined,null,NaN,'NaN',0,'a',{},1,'true',true,15,false,undefined,null,NaN,'NaN', 0,'a',{}];
console.log(distinct(arr))
//输出结果:[0, 1, 15, NaN, "NaN", NaN, "NaN", {}, {}, "a", false, null, "true", true, "true", true, undefined]
//NaN、{} 无法去重
四 利用includes
新建一个空的结果数组,循环原数组判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则添加进数组。
function distinct(arr) {
var array = [];
for(var i = 0; i < arr.length; i++) {
if(!array.includes(arr[i])) {//includes 检测数组是否有某个值
array.push(arr[i]);
}
}
return array;
}
var arr = [1,'true',true,15,false,undefined,null,NaN,'NaN',0,'a',{},1,'true',true,15,false,undefined,null,NaN,'NaN', 0,'a',{}];
console.log(distinct(arr));
//输出结果:[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
//{} 无法去重
五、利用Map数据结构去重
创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。
function distinct(arr) {
var map = new Map();
var array = new Array(); // 数组用于返回结果
for (var i = 0; i < arr.length; i++) {
if(map.has(arr[i])) { // 如果有该key值
map.set(arr[i], true);
} else {
map.set(arr[i], false); // 如果没有该key值
array.push(arr[i]);
}
}
return array;
}
var arr = [1,'true',true,15,false,undefined,null,NaN,'NaN',0,'a',{},1,'true',true,15,false,undefined,null,NaN,'NaN', 0,'a',{}];
console.log(distinct(arr));
//输出结果:[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
//{} 无法去重