欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 【前端面试】七、算法-节流、柯里化、数组和集合

【前端面试】七、算法-节流、柯里化、数组和集合

2024/10/24 5:20:05 来源:https://blog.csdn.net/weixin_49015558/article/details/140793146  浏览:    关键词:【前端面试】七、算法-节流、柯里化、数组和集合

数组常用方法

  • forEach:遍历数组,对数组的每个元素执行一次提供的函数。

  • map:创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。

  • filter:创建一个新数组,其包含通过所提供函数实现的测试的所有元素。

  • reduce:对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

数组去重

  • 使用Set:利用Set的自动去重特性,将数组转换为Set,再转换回数组。

  • 使用indexOf:通过遍历数组,检查当前元素是否已在结果数组中出现过(使用indexOf方法)。

  • 使用Map:利用Map对象的键是唯一的特性,通过遍历数组,将数组元素作为键存入Map,最后再从Map中获取所有键组成的数组。

常见的数据结构

  1. 线性表:数组、链表(单向链表、双向链表、循环链表)。

  2. 栈与队列:后进先出(LIFO)和先进先出(FIFO)的数据结构。

  3. 树与二叉树:二叉查找树、平衡二叉树(如AVL树、红黑树)、堆等。

  4. :用于表示多对多关系的数据结构,包括有向图和无向图。

设计模式

  1. 单例模式:确保一个类仅有一个实例,并提供一个全局访问点。

  2. 工厂模式:创建对象时不直接指定具体类,而是通过调用共同的接口来指定创建哪种类的实例。

  3. 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

Promise.all的实现

function PromiseAll(promises) {  return new Promise((resolve, reject) => {  const results = [];  let count = 0;  promises.forEach((promise, index) => {  Promise.resolve(promise).then(  value => {  results[index] = value;  if (++count === promises.length) {  resolve(results);  }  },  error => {  reject(error);  }  );  });  });  
}

Event Emitter的实现(简化版):

class EventEmitter {  constructor() {  this.listeners = {};  }  on(event, callback) {  if (!this.listeners[event]) {  this.listeners[event] = [];  }  this.listeners[event].push(callback);  }  emit(event, ...args) {  if (this.listeners[event]) {  this.listeners[event].forEach(callback => callback(...args));  }  }  
}

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>// 函数节流// 过滤重复滚动事件const throttle1 = (func, delay = 60) => {let lock = falsereturn (...args) => {if(lock) returnfunc(...args)lock = truesetTimeout(() => { lock = false }, delay)}}document.addEventListener('scroll',throttle1(console.log))// 过滤重复的验证事件(用户输入停止后300ms触发验证)const throttle2 = (func, delay = 300, I = null) => {return (...args) => {clearInterval(I)// I = setTimeout(() => func(...args), delay)I = setTimeout(func.bind(null,...args), delay)}}// 柯里化const curry1 = fn => {return  function curried(...args) {if(args.length >= fn.length) {// 参数足够,执行函数return fn.apply(this,args)} else {// 参数不足,返回一个函数继续收集剩余参数return (...args2) => {return curried.apply(this, args.concat(args2))}}}}const curry2 = func => {const g = (...allArgs) => allArgs.length >= func.length ? func(...allArgs) : (...args) => g(...allArgs, ...args)return g}/* math函数Math.abs:求绝对值Math.ceil:向上取整Math.floor:向下取整Math.round:四舍五入Math.max:求最大值Math.min:求最小值Math.pow:求幂Math.sqrt:求平方根Math.random:生成0-1之间的随机数Math.sign:判断正负,求数值符号 */// 判断素数const isPrime = num => {if(num <= 1) return falsefor(let i = 2; i <= Math.sqrt(num); i++) {if(num % i === 0) return false}return true}// n以内的素数function *sieve_primes(n) {let arr = Array.from({length: n - 2}, (item, index) => index + 2)while(arr.length > 0) {let prime = arr[0]yield primearr = arr.filter(num => num % prime !== 0)}}const it = sieve_primes(100)// console.log('100以内的素数=================');// console.log([...it]);/* 数组相关操作Array.length:长度Array.from:类数组转数组、创建数组Array.isArray:是否为数组Array.includes:是否包含某元素Array.indexOf:获取元素序号Array.concat:合并数组(元素)Array.slice:截取数组Array.splice:删除、插入、替换Array.push/pop/shift/unshift:入栈、出栈、出队、入队Array.join:数组转字符串Array.reverse:数组反转Array.sort:数组排序Array.filter:过滤Array.map:映射 1对1Array.reduce:累加 聚合 多对1Array.reduceRight:从右往左Array.some:是否有满足Array.every:是否全部满足Array.forEach:遍历 */// 数组去重const unique = arr => [...new Set(arr)]// 数组替换const arr1 = [1,2,3,4,5,6,7] // console.log('splice测试=================');// console.log(arr1.splice(2,2,'x')); // [3,4]// console.log(arr1); // [1,2,'x',5,6,7] // console.log(arr1.splice(2,1)); // ['x']arr1.splice(2,0,'y')// console.log(arr1); // [1,2,'y',5,6,7] // 括号匹配const is_balance = str => {const [first, ...others] = strconst stack = [first]while (others.length > 0) {const n = others.shift()const c = stack[stack.length - 1]const ifMatch =  (c === '(' && n === ')') || (c === '[' && n === ']') || (c === '{' && n === '}')ifMatch ? stack.pop() : stack.push(n)return stack.length === 0}}const students = [  {  id: 1,  name: "Alice",  score: 92,  groupId: 1,  },  {  id: 2,  name: "Bob",  score: 55,  groupId: 2,  },  {  id: 3,  name: "Charlie",  score: 88,  groupId: 1,  },  {  id: 4,  name: "David",  score: 76,  groupId: 3,  },  {  id: 5,  name: "Eva",  score: 62,  groupId: 2,  }  ];  const groups = [  { id: 1, name: "Math Group" },  { id: 2, name: "Science Group" },  { id: 3, name: "History Group" }  ];  // 投射const studentWithGrade = students.map(student => {return {...student,grade: student.score >= 60 ? '及格' : '不及格'}})// console.log('投射测试=================');// console.log(studentWithGrade);// 过滤const passedStudents = students.filter(student => student.score >= 60)// console.log('passedStudents 测试=================');// console.log(passedStudents);const group1Students = students.filter(student => student.groupId === 1)// console.log('group1Students 测试=================');// console.log(group1Students);// 分组const studentInGroups = students.reduce((groups, student) =>{groups[student.groupId] = [...(groups[student.groupId] || []), student]return groups},{})// console.log('studentInGroups 测试=================');// console.log(studentInGroups);// 联合const studentWithGroupInfo = students.map(student => {return {...student,groupInfo: groups.find(group => group.id === student.groupId)}})// console.log('studentWithGroupInfo 测试=================');// console.log(studentWithGroupInfo);// 排序 Array.prototype.sort 方法会对原数组进行排序const sortedByScoreAsc = students.slice().sort((a, b) => a.score - b.score);// console.log('sortedByScoreAsc 测试=================');// console.log(sortedByScoreAsc);const sortedByScoreDesc = students.slice().sort((a, b) => b.score - a.score);// console.log('sortedByScoreDesc 测试=================');// console.log(sortedByScoreDesc);const nameArr = ['张三','李四','王五'].sort((a,b) => a.localeCompare(b, 'zh'))// console.log('nameArr 测试=================');// console.log(nameArr);/* 集合操作 new Set([...arr])Set.add(element):添加元素Set.delete(element):删除元素Set.has(element):是否包含元素Set.clear():清空集合Set.size:集合长度Set.values():返回Iterator对象 */// 子数组和整除// 写一个函数solve(arr, N),判断数组arr中某一项,或任意多项的和,是否被另一个整数N整除// 例如:solve([1,2,3,4,5], 7) => true// 求数组全部组合后求余数const solve = (arr, N) => {const s = new Set()for(let i = 0; i <= arr.length; i++) {for (let j = i + 1; j <= arr.length; j++) {const remain = arr.slice(i, j).reduce((a,b) => a + b, 0) % Ns.add(remain)}}return s.has(0)}// 子问题结构思想const solve2 = (arr, N) => {const s = new Set()while (arr.length > 0) {const ak = arr.pop()s.add(ak)s.forEach(item => {s.add((item + ak) % N)})}return s.has(0)}// console.log('子数组和整除 测试=================');// console.log(solve2([1,2,3,4,5], 7));// console.log(solve2([3,9], 9));// 笛卡尔积// 例如[1,2] X ['a', 'b'] = [[1, 'a'], [1, 'b'], [2, 'a'], [2,'b']]function cartesianProduct(...Matrix) {if(Matrix.length ===0) return []if(Matrix.length === 1)return Matrix[0]let i = 0return Matrix.reduce((A,B) => {const product=[]for(let i=0; i<A.length; i++){for(let j=0; j<B.length; j++){product.push(Array.isArray(A[i]) ? [...A[i], B[j]] : [A[i], B[j]])}}return product})}result = cartesianProduct([1, 2], ['a', 'b']);  console.log(result); // [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]</script></body>
</html>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com