Vue3开发中必会的8道手写算法题,前端面试高频考点

更新日期: 2026-03-31 阅读: 12 标签: 面试

结合Vue3开发实际场景(表单处理、列表渲染、数据处理、路由/树形数据),整理了前端面试和工作中最常用的8道手写算法题,纯JS实现,在Vue3中可直接复用。


1. 数组去重

场景:去重下拉选项、表格数据、路由菜单等

// 方法1:Set最简写法
const uniqueArr = (arr) => [...new Set(arr)];

// 方法2:原生遍历(面试手写)
const uniqueArr2 = (arr) => {
  const res = [];
  arr.forEach(item => {
    if (!res.includes(item)) res.push(item);
  });
  return res;
};

// 测试
console.log(uniqueArr([1,2,2,3,3,3])); // [1,2,3]

2. 深拷贝

场景:拷贝props、state,避免对象引用污染

function deepClone(obj) {
  // 基础类型直接返回
  if (typeof obj !== 'object' || obj === null) return obj;

  // 处理数组/对象
  const result = Array.isArray(obj) ? [] : {};

  for (let key in obj) {
    // 递归拷贝
    if (obj.hasOwnProperty(key)) {
      result[key] = deepClone(obj[key]);
    }
  }
  return result;
}

// 测试
const obj = { a: 1, b: { c: 2 } };
const newObj = deepClone(obj);
newObj.b.c = 99;
console.log(obj.b.c); // 2 原数据不受影响

3. 防抖

场景:输入框实时搜索、窗口resize、滚动优化

function debounce(fn, delay = 300) {
  let timer = null;
  return (...args) => {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

// Vue3中使用
const handleSearch = debounce(() => {
  console.log('发送搜索请求');
}, 500);

4. 节流

场景:滚动加载、按钮频繁点击、动画

function throttle(fn, delay = 300) {
  let flag = true;
  return (...args) => {
    if (!flag) return;
    flag = false;
    setTimeout(() => {
      fn.apply(this, args);
      flag = true;
    }, delay);
  };
}

// Vue3滚动加载使用
const handleScroll = throttle(() => {
  console.log('加载下一页');
}, 1000);

5. 树形数据扁平化

场景:后台返回树形菜单,转成一维数组用于权限判断

// 树结构扁平化
function treeToArray(tree) {
  let res = [];
  const fn = (data) => {
    data.forEach(item => {
      res.push(item);
      // 递归子节点
      if (item.children && item.children.length) {
        fn(item.children);
      }
    });
  };
  fn(tree);
  return res;
}

// 测试数据
const tree = [
  { id:1, name:'首页', children:[{id:2,name:'子页面'}] }
];
console.log(treeToArray(tree)); 
// [{id:1,name:'首页'},{id:2,name:'子页面'}]

6. 数组转树形结构

场景:后台返回一维数组,转成树形菜单渲染

function arrayToTree(arr, pid = 0) {
  return arr
    .filter(item => item.parentId === pid)
    .map(item => ({
      ...item,
      // 递归子节点
      children: arrayToTree(arr, item.id)
    }));
}

// 测试数据
const arr = [
  { id:1, name:'首页', parentId:0 },
  { id:2, name:'子页面', parentId:1 }
];
console.log(arrayToTree(arr));

7. 数组扁平化

场景:处理多级分类、表格嵌套数据

// 方法1:递归(面试手写)
function flatten(arr) {
  let res = [];
  arr.forEach(item => {
    Array.isArray(item) ? res = res.concat(flatten(item)) : res.push(item);
  });
  return res;
}

// 方法2:ES6一行代码
const flatten2 = (arr) => arr.flat(Infinity);

// 测试
console.log(flatten([1,[2,[3,4],5]])); // [1,2,3,4,5]

8. 快速排序

场景:自定义表格排序、数据排序

function quickSort(arr) {
  if (arr.length <= 1) return arr;
  // 基准值
  const mid = arr[0];
  const left = [];
  const right = [];
  for (let i = 1; i < arr.length; i++) {
    arr[i] < mid ? left.push(arr[i]) : right.push(arr[i]);
  }
  // 递归
  return [...quickSort(left), mid, ...quickSort(right)];
}

// 测试
console.log(quickSort([3,1,5,2,4])); // [1,2,3,4,5]

总结

高频必背:深拷贝、防抖节流、数组去重、树结构互转

Vue3核心:防抖节流用于性能优化,深拷贝用于避免响应式污染

面试高频:快速排序、树形数据处理(前端业务最常考)

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13535

相关推荐

有趣的Js面试题_如何让 (a == 1 && a == 2 && a == 3) 返回 true

题目大意为:JS 环境下,如何让 a == 1 && a == 2 && a == 3 这个表达式返回 true ?这道题目乍看之下似乎不太可能,因为在正常情况下,一个变量的值如果没有手动修改,在一个表达式中是不会变化的。

前端面试之webpack面试常见问题

什么是webpack和grunt和gulp有什么不同?什么是bundle,什么是chunk,什么是module?什么是Loader?什么是Plugin?如何可以自动生成webpack配置?webpack-dev-server和http服务器如nginx有什么区别?

Web前端年后跳槽面试复习指南

很多童鞋可能年后有自己的一些计划,比如换份工作环境,比如对职业目标有了新的打算。当然面试这一关不得不过,大概又不可能系统性的复习,这里罗列一些 重点 面试的知识点和文章,

React常见面试题

React常见面试题:React中调用setState之后发生了什么事情?React中Element与Component的区别?优先选择使用ClassComponent而不是FunctionalComponent?React中的refs属性的作用是什么?React中keys的作用是什么?

毕业一年左右的前端妹子面试总结

把面试当做学习,这个过程你会收益很大。前端知识很杂,可能实际工作中用到的技术,像框架都是跟着公司的要求走的,像我最近也在看React啦,Vue和React都对比着再学习

js练习笔记:10道JavaScript题目

10道JavaScript题目:累加函数addNum、实现一个Person类、实现一个arrMerge 函数、实现一个toCamelStyle函数、setTimeout实现重复调用、实现一个bind函数、实现一个Utils模块、输出一个对象自身的属性

一篇文章教会你面试中的小套路

面试,一个短时间内对某个人做出判断的测试。很多时候,工程师们只准备了相关的技术点,却没有对非技术的软实力部分做准备。而软实力的考察,不仅贯穿整个面试流程中,更在BOSS面和HR面中尤为关键。鉴于当前业界也没有特别契合的攻略文档,仅有有几篇文章还是HR写的,特有此文

写给程序员的 HR 面试指南

首先,切记不要诋毁你的老东家。你应该把你的离职原因集中表述在“寻找新机会或新的平台”以及尝试在新的岗位上提升自己。当然,这样的回答对于一般职位的应聘者来说不会造成减分

CSS 面试知识点总结

最近在整理 CSS 的时候发现遇到了很多面试中常见的面试题,本部分主要原作者在 Github 等各大论坛收录的 CSS 相关知识和一些相关面试题时所做的笔记,分享这份总结给大家,对大家对 CSS 的可以来一次全方位的检漏和排查

vue面试时需要准备的知识点

vue上手可以说是比较轻松而且简单,如果你用过angular,react,你也会很喜欢vue。vue的核心思想依旧是:构建用户界面的渐进式框架,关注视图的变化。这也是为什么新建的文件是结构是template script style

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!