web前端面试系列 - 算法( 数组去重 )
1. 思路:设置一个临时数组temp,然后遍历要去重的数组arr,如果arr中的元素能够在temp中找到,则跳过此元素,否则将此元素存入temp,最后返回temp。
实现一
function unique(arr){
var temp = [];
var len = arr.length;
for(var i = 0; i < len; i++){
if(temp.indexOf(arr[i]) === -1) temp.push(arr[i]);
}
return temp;
}
实现二
function unique( arr ) {
var temp = [];
var len = arr.length;
for (var i = 0; i < len; i++) {
var isRepeated = false;
for ( var j = 0; j < temp.length; j++){
if ( arr[i] === temp[j] ){
isRepeated = true;
break;
}
}
if ( !isRepeated ) temp.push( arr[i] );
}
return temp;
}
2. 思路:设置一个临时数组temp,然后遍历要去重的数组arr,如果arr[i]中的元素在arr中出现的第一次的位置也为i,则将其存入temp,否则跳过此元素,最后返回temp。
function unique(arr){
var temp = [];
var len = arr.length;
for (var i = 0; i <len; i++){
if(arr.indexOf([arr[i]) === i) temp.push(arr[i]);
}
return temp;
}
3. 思路:设置一个临时对象tempObj,然后遍历要去重的数组arr, 如果arr[i]中的元素在此对象中有标记,则跳过,否则在临时对象中进行标记,并将其存入临时数组tempArr, 最后返回tempArr。
function unique(arr){
var tempObj = {};
var tempArr = [];
var len = arr.length;
for (var i = 0; i < len; i++) {
if ( !tempObj[arr[i]] ){
tempObj[arr[i]] = true;
tempArr.push(arr[i]);
}
}
return tempArr;
}
4. 思路:对要去重的数组 arr 先进行排序,这样重复的元素就排在了相邻的位置,然后对数组 arr 进行遍历,将arr[i] 与 临时数组 temp 中的最后一个元素进行比较,如果不同则将其存入临时数组,如果相同则跳过此元素,最后返回临时数组。
function unique( arr ) {
var temp = [];
var len = arr.length;
arr.sort();
temp.push(arr[0]);
for ( var i = 1; i < len; i++ ) {
if ( arr[i] !== temp[temp.length-1] ) temp.push(arr[i]);
}
return temp;
}
写在最后:其实在真实的项目中,我们没有必要自己去实现这样的函数,利用underscore.js 或者lodash 这样的函数库提供的方法是更好的选择。
web前端面试系列 - 算法( 数组去重 )的更多相关文章
- web前端面试系列 一 js闭包
一.什么是闭包? JavaScript高级程序设计第三版: 闭包是指有权访问另一个函数作用域中的变量的函数. 在js中定义在函数内部的子函数能够访问外部函数定义的变量,因此js内部函数就是一个闭包. ...
- web前端面试系列 - js中的prototype
js中一切皆为对象,其中函数也是一种对象, 而每个函数都有一个prototype属性,其值也是一个对象. 一.prototype的作用 1. 在多个实例对象之间共享数据和方法. 2. 通过原型链实现继 ...
- web前端面试系列 - 数据结构(两个栈模拟一个队列)
一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...
- Web前端面试笔试题总结
最近一段时间要毕业了,忙着找工作,见过不少笔试面试题,自己总结了一些加上网上找的一些整合了一下.答案暂时都东拼西凑出来了,但是还是先不发出来,一方面是答案并不是唯一的并且自己的答案不能保证对,另一方面 ...
- 2016年Web前端面试题目汇总
转载: 2016年Web前端面试题目汇总 以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢 ...
- 2019前端面试系列——JS面试题
判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 'ob ...
- 2019前端面试系列——Vue面试题
Vue 双向绑定原理 mvvm 双向绑定,采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty()来劫持各个属性的 setter.getter,在数 ...
- web前端面试试题总结---html篇
HTML Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器 ...
- 百度web前端面试2015.10.18
邮件里通知的周日下午两点参加百度校招面试,我13:10分就到了,前台先让我拿了个面试资格单(上面是我的信息),然后在web前端面试入口排队,面试在百度食堂举行的,等了大概1个小时,放我去面试.都是一对 ...
随机推荐
- 用-webkit-box-reflect制作倒影
1.只在webkit内核的浏览器上有效果 2.语法: -webkit-box-reflect: <direction> <offset> <mask-box-image& ...
- poj3728The merchant
The merchant Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4800 Accepted: 1666 Desc ...
- Unity 过度光照贴图
背景:开关窗帘过程,让环境在亮和暗之间过度 事先烘培出亮.暗两张Lighting map.然后代码实现,窗帘开关由动作实现,而代码中通过动作执行进度来过度两张Lighting map void OnA ...
- jQuery控件之分页控件-- kkpager v1.3使用简介
js分页展示控件,传入简单参数就能使用的分页效果控件 在线测试链接: http://pgkk.github.io/kkpager/example/pager_test.html http://pgkk ...
- es6总结(九)--Iterator & for of
- select与stdio混合使用的不良后果
参考以下链接自己补充实验:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.aspx?opt=admin int main(int a ...
- select、poll和epoll的区别(转载)
select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...
- Laravel 基础知识
使用版本Laravel5.1.======================================================目录简单介绍:app目录,核心目录,应用目录.bootstra ...
- indexOf()、includes()、startsWith()、endsWith()
是否包含字符串三种新方法 传统上,JavaScript只有 indexOf 方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6又提供了三种新方法. includes():返回布尔值,表示是否 ...
- ES6之Array.includes()函数
一.定义 includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. 二.语法 arr.includes(searchElement) arr.includ ...