面试题中遇到的算法与js技巧(一)
近一周在忙着面试,本月第一次更博,甚是想念。
基本上大公司都会要求一些算法或者数据结构类的东西,挑了些有意思的敲了下。这方面自己还不是很精通,只能一步一个脚印来积累了。
1.根据查询字符串获取对象数据,可自行根据需求选择格式,此处以key:value的格式生成
// 这里可以使用正则匹配,但仔细向后,字符串的一些基本方法完全可以解决问题 var str = 'www.test.com/test?str1=aa&str2=bb&str3=cc'; function queryStr (str) { var target = str.substr(str.indexOf('?') + 1); var groupItem = target.split('&'); var temp = {} for(var i=0; i<groupItem.length; i++) { var key = groupItem[i].split('=')[0]; var value = groupItem[i].split('=')[1]; temp[key] = value; } return temp; } console.log(queryStr(str))
2.数组随机置换,时间复杂度很重要!!
// 普通的随机置换都可以,但实际中更看重的时时间复杂度低的算法 var array = [1,5,9,6,2,6]; function tempArray (array) { var len = array.length; var temp = []; while(len--) { var ran = Math.floor( Math.random() * len); temp.push((array.splice(ran,1))[0]) } return temp } console.log(tempArray(array))
3.模拟new过程
大致分为五部:
(1) 创建一个空对象
(2)修改 prototype
(3)对象的constructor属相改为构造函数
(4)更正this指针的指向
(5)返回对象
function newKeyword (constructor, ...param) { let obj = {}; let proto = Object.create(constructor.prototype); Object.setPrototypeOf(obj, proto); // obj.__proto__ = proto 在浏览器端存在兼容性问题 proto.constructor = constructor; constructor.apply(obj, param); return obj; } function Baby (name, age) { this.name = name; this.age = age; this.show = function () { console.log('我是小柚子'); } } let baby = newKeyword(Baby, 'pomelo', 1)
4.原生js实现自定义事件,面向对象思维实现
// 自定义事件类 function MyEvent () { this.evList = {} this.addEvent = function (type, fn) { if(typeof fn !== 'function') return this.evList[type] = fn } this.dispatchEvent = function (type, data) { var dataObj = {} dataObj.data = data this.evList[type](dataObj) } } var ev = new MyEvent() // 添加自定义事件 ev.addEvent('test', function (e) { alert(e.data) }) // 触发自定义事件 document.querySelector('.btn').onclick = function () { ev.dispatchEvent('test', 'pomelo') }
5. 数组去重的四种方法,同样,时间复杂度很重要!!
var arr = [1,1,2,3,5,5] // 从前向后逐个比较,相同的删除 Array.prototype.distinct1 = function () { var arr = this; for(var i=0; i<arr.length; i++) { for(var j=i+1; j<arr.length; j++) { if(arr[i] === arr[j]) { arr.splice(j,1) j = ++i; } } } return arr } // 从前向后比较,不相同的push到新数组 Array.prototype.distinct2 = function () { var arr = this; var temp = []; for(var i=0; i<arr.length; i++) { for(var j=i+1; j<arr.length; j++) { if(arr[i] === arr[j]) { j = ++i; } } temp.push(arr[i]) } return temp } // 利用对象属性名不能重复的特性 Array.prototype.distinct3 = function () { var obj = {}; var arr =this; var temp = []; for(var i=0; i<arr.length; i++) { if(!obj[arr[i]]) { temp.push(arr[i]) obj[arr[i]] = 1; } } return temp } // 利用indexOf 如果无法匹配到相同的,push进新数组 Array.prototype.distinct4 = function () { var arr = this; var temp = []; arr.forEach(function (item, i) { var num = arr.indexOf(item, i+1) if(num === -1) { temp.push(item) } }) return temp } console.log(arr.distinct1()) console.log(arr.distinct2()) console.log(arr.distinct3()) console.log(arr.distinct4())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2017-03-24 less可以做什么?less详解!(less嵌套选择器实现纯CSS二级导航)