在学习Js的时候经常会用到数组去除重复项的问题
下列将用不同的方法实现去重的问题:
一、利用双重循环和数组splice方法
function unique(arr) {
var len = arr.length
//第一重控制外部循环次数
for (var i = 0; i < len; i++) {
//第二重控制比较次数
for (var j = i + 1; j < len; j++) { //数组中第一项和第二项作比较
if (arr[i] === arr[j]) {
arr.splice(j, 1)
j-- //如果已经有相同项删除时,j应该减去1,在跟后面压进来的值作比较
}
}
}
return arr
}
console.log(unique(arr))
二、利用数组重排序后比较相邻的两项
function unique(arr) {
if (!Array.isArray(arr)) return //如果不是数组直接return
arr = arr.sort() //数组重排序
var newArr = [] //新数组存放值
for (var i = 0; i < arr.length; i++) {
if (arr[i] != arr[i + 1]) { //因为数组经过排序,只考虑相邻两项即可
newArr.push(arr[i])
}
}
return newArr
}
console.log(unique(arr))
三、利用indexOf方法进行去重
function unique(arr) {
if (!Array.isArray(arr)) return
var newArr = []
for (var i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) === -1) { //判断新数组中是否有这个元素,没有就压进新数组
newArr.push(arr[i])
}
}
return newArr
}
console.log(unique(arr))
当然,跟indexOf()
具有相同用法的还有includes()
方法只需要重写判断语句即可
if (!newArr.includes( arr[i])) //返回的是boolean值
四、ES6中set构造函数
function unique (arr) {
return Array.from(new Set(arr)) //Array.from 方法可以将 Set 结构转为数组。
}
五、reduce函数实现去重
var newArr = arr.reduce(function (prev, cur) {
prev.indexOf(cur) === -1 && prev.push(cur);
return prev;
},[]);
prev是刚开始在回调函数中定义的空数组
实现的基本原理如下:① 初始化一个空数组
② 将需要去重处理的数组中的第1项在初始化数组中查找,如果找不到(空数组中肯定找不到),就将该项添加到初始化数组中
③ 将需要去重处理的数组中的第2项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组中
④ ……
⑤ 将需要去重处理的数组中的第n项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组中
⑥ 将这个初始化数组返回
Js中去除数组重复项实现的方法有很多,但上述方法时比较简单省力的,推荐使用。其中ES6的set()
方法最为适用。