js数组去重、找到数组中重复元素和不重复元素三道数组相关算法题
前端面试中关于数组问题层出不穷,就我见到三个问题做出以下分析。
问题如下:
-
问题1:如何实现数组的去重
-
问题2:从下面数组中找出不重复的元素算法
-
问题3:从下面数组中找出重复的元素算法
1.实现数组去重的方法
实现数组去重有多重方法:
-
方法1:计数排序,遍历每个元素为其设置布尔值。只针对正整数。
var a = [5,8,3,4,3,2, 8]; var onlyElement = {}; for(let i = 0;i < a.length; i++){ if (a[i] in onlyElement) { //可什么也不做 }else{ //onlyElement的key不存在a[i]元素时设为TRUE onlyElement[a[i]] = true } } console.log(onlyElement) //onlyElement对象的key值是数组中出现过的元素,且不重复,打印key值即可 console.log(Object.keys(onlyElement))
结果为:
-
方法2:使用ES6的set方法
最简单的方法。
var a = [5,8,3,4,3,2, 8]; a = new Set(a) console.log(a)
输出结果:
2.找到数组中不重复的元素
使用问题1的解决思路,遍历每一个元素,为其设置布尔值,以供选择。
思路:
-
创建一个onlyElement 对象,key值是数组中出现的元素,value值是数组中元素出现的次数,出现多于一次,都会赋值为false。出现一次即不重复的元素,会被赋值为true。
-
所以onlyElement 的key值是数组中所有出现过得元素,也相当于是去重后的元素。
-
遍历onlyElement 对象,判断其value值是否为true。
-
创建一个新数组用于保存不重复的元素
代码如下:
var a = [5,8,3,4,3,2, 8];
var onlyElement = {};
var newonly = []
for(let i = 0;i < a.length; i++){
if (a[i] in onlyElement) {
//将onlyElement的key存在a[i]元素设为FALSE
onlyElement[a[i]] = false
}else{
//onlyElement的key不存在a[i]元素的设为TRUE
onlyElement[a[i]] = true
}
}
console.log(onlyElement)
//遍历onlyElement,值为TRUE的是不重复元素,值为FALSE的是重复元素,
//将不重复的元素保存到新数组中,即可输出不重复元素列表;
for(let key in onlyElement){
//console.log(onlyElement[key])
if (onlyElement[key]===true){
newonly.push(key)
}
}
console.log(newonly)
输出结果:
3.找到数组中重复的元素
问题2已经为问题3定好了思路,重复与不重复的元素都可以在onlyElement 对象中呈现,只需要遍历onlyElement 对象,判断其value值是否为false,然后创建一个新数组用于保存重复的元素。
代码只有第60行有改动。