每日一篇,面试题 第二篇 "JS数组去重"

347 阅读1分钟

1.前言

每日记录一篇大厂面试题

2.题目

你对数组去重有了解吗? ES5怎么和ES6 分别阐述一下实现思路!

// 如果当前数组中有10万条数据、请问哪种方法最优?面试时大脑飞速运作,,,

3.解析

js数组去重网上有一堆的文章讲解、本篇文章是针对自己面试经验回答一下自己的心得 网上其他的有十几种 我就简单阐述几种,哈哈哈

1、ES6 new Set() 去重

ES6的语法比较简单明了

// 去重的数组
var list = [1,1,2,2,3,3];

function unique(arr) {
    return Array.from(new Set(arr))
}
// 输出返回值
console.log(unique(list));// [1,2,3]

// 其实也可以直接使用以下方案
console.log([...new Set(list)])// [1,2,3]

2、ES5 indexOf 去重

判断indexOf的值是否与元素索引值相等

var list1 = [1, 1, 2, 2, 3, 3];

function unique(list) {
  let arr = [];
  // 数组遍历
  for (var i = 0; i < list.length; i++) {
    if (list.indexOf(list[i]) === i) {
      arr.push(list[i])
    }
  }
  // 返回
  return arr;
}
// 输出返回值
console.log(unique(list1));// [1,2,3]

3、最优方案

上面提到处理10万条数据 最优的解决方案 利用对象来处理

function unique(list) {
  // 首先处理是否传入的是数组 不是的话 直接return
  if (!Array.isArray(list)) {
    console.log('type error!')
    return
  }

  var arrry = [],
      obj = {},
      len = list.length;
  
  // 不管怎么有 10万条数据  for是跑不掉  
  for (var i = 0; i < len; i++) {

    // 如果当前对象中没有该属性 那就添加到array数组中
    if (!obj[list[i]]) {
      arrry.push(list[i]);
      // 记录当前对象属性为1 未保存则push到新数组并用object[list[i]]=1的方式记录保存
      obj[list[i]] = 1
    } 
  }
  return arrry;
}

系列文章