前端面试系列之数组去重
2018-05-11 18:08
25 查看
1. 双循环去重
原理: 定义一个包含原始数组第一个元素的数组,然后遍历原始数组,对原始数组进行遍历,将原始数组中的每一个元素与新数组中的每一个元素进行对比,如果不重复就添加到新数组里,最后返回新数组。这种方式很耗费时间喝内存,不适合大型数组。
// 双重循环去重,原理: 先定义一个包含原始数组的第一个元素的新数组,记住这里是新数组,然后进行两次循环,把新数组和原始数组进行对比,为啥要进行两次循环呢,写着写着的时候,你发现,你如果只循环一次呢,你没办法对比两个数组哇。 function unrepeat(arr) { // body... if (!Array.isArray(arr)) { console.log('type err'); return; } let newArr = [arr[0]]; for (let i = 1; i< arr.length; i++) { let flag = true; // 这是你循环的第一次,你在这里能够拿到传入的数组的每一个值。接下来你要做的就是把这个循环的每一个值和另一个循环的每一个值进行对比,执行的顺序是,第一个循环先给你一个饼,然后你去第二个里拿出来每一个,对比这些里面和第一个有没有不同的地方。第二个对比完,在抛给你一个,依次类推。 for(let j = 0; j<newarr.length; j="" ++)="" {="" 这里是对你要存的不重复的数组元素数组的循环="" ,为啥里面要有一个了呢,那是因为啊,它是老大哇,就算有重复也是后面的问题。="" if(arr[i]="==newArr[j])" flag="false;" break;="" }="" if="" (flag)="" newarr.push(arr[i])="" return="" newarr;="" <="" code="" style="-webkit-print-color-adjust: exact;">
#### let 和var 的区别: 1.作用域不同,let 和cost 都是块级作用域,而var是全局作用域。 #### 2.使用let 定义的是常量,在同一作用域,再次赋值,就会报错。使用var 的情况下,后执行的会替换掉先执行的。 #### 3.声明一个变量,但是未赋值的情况下,输出都是undefined,但是使用let声明但是没有赋值的,就会报错,而使用var的只是输出了undefined,let 相对于var 有着更严格的语法检查。 ### 2. indexOf 方法去重1数组的indexof方法可以返回某个指定的元素在数组中首次出现的位置,该方法首先丁酉一个空数组,然后调用indexof 对原数组进行遍历判断,如果元素不在res中,则将其push放进去,最后将新数组返回
function unquite (arr) { if(!Array.isArray(arr)) { console.log('type err') } let newArr = []; for (let i = 0; i< arr.length; i++) { if(newArr.indexOf(arr[i]) ===-1)) { newArr.push(arr[i]) } } return newArr; }### 3.indexOf 之2利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素
function unique (arr) { if (!Array.isArray(arr)) { console.log('type error'); return; } return Array.prototype.filter.call(arr,function(item,index){ return arr.indexOf(item) === index; }) }
4. 相邻元素去重
这种方法首先调用了数组的排序方法,sort() ,然后根据排序后的结果进行遍历及相邻元素进行比对,如果相等则跳过改元素,直到遍历结束。function unquire (arr){ if(!Array.isARRAY(arr)) { console.log("type err") } arr = arr.sort() let res = [arr[0]] for(let i = 1; i<arr.length; i++){="" if(arr[i]="" !="=arr[i-1])" {="" }="" <="" code="" style="-webkit-print-color-adjust: exact;">
5. 利用对象属性去重
创建空对象,遍历数组,将数组中的值设为对象的属性,并给该属性赋初始值为1,每出现一次,对应的属性值增加1,这样,属性对应的就是该元素出现的次数了
function unquite (arr) { if(!Array.isArray(arr)) { console.log('tyoe err') return; } let res = [], obj = {}; for(let i = 0; i<arr.length; i++)="" {="" if(!obj[arr[i]]){="" res.push(arr[i])="" obj[arr[i]]="1" }="" else="" ++="" return="" res;="" <="" code="" style="-webkit-print-color-adjust: exact;">
6.set 与解构赋值去重
es6中新增了数据类型set,set的一个最大的特点就是数据不重复。set函数可以接受一个数组作为参数来初始化,利用该特性也能做到数组去重。function unique (arr){ if(!Array.isArray(arr)) { console.log('type error'); return; } return [...new Set(arr)] }
7. Array.form 与set 去重
Array.form 方法可以将结构转换为数组结果,而我们知道set结果是不重复的数据集,因此能够达到去重的目的function unique (arr){ if (!Array.isArray(arr)) { console.log('type error!') return } return Array.form(new Set(arr)) }
本文为总结面试题,看的是别人发的方法。
阅读更多相关文章推荐
- 前端面试常问问题--数组系列
- 微软面试100题系列-数组连续和最大
- 前端面试系列之---DOM操作 BOM
- 前端面试系列之----补充问题集合
- 微软面试100题系列---求子数组的最大和
- 面试笔试系列2-数组指针和指针数组的区别
- 合格前端系列第九弹-前端面试那些事
- 破解前端面试系列(3):如何搞定纸上代码环节?
- 微软面试100题系列---调整数组顺序,使奇数位于偶数之前
- C/C++面试之算法系列--整数数组的循环右移
- 破解前端面试80% 应聘者不及格系列:从DOM说起
- 前端面试系列之二 类型转换
- 也谈前端面试常见问题之『数组乱序』
- 【前端面试】如何求一个数组的平均值?
- 【前端面试】创建长度为100,内容为下标的数组,你能想到几种方法?
- 程序员笔试面试算法题系列--数组
- C++指针数组和数组指针--笔试面试系列
- 面试100题系列之19二分数组
- 前端开发面试总结系列一
- 前端面试系列(二):面试常问的几个HTML5特性