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", {}, {}]
//{} 无法去重