数组去重,第一反应就是for循环,如果一个for循环解决不了,那就多来几个。。。哈哈,心血来潮查了下数组去重的方法,是我见识短浅。以下,我将介绍九种js中数组去重的方法:
- 利用 ES6 Set去重
- 利用splice()去重
- 利用indexOf()去重
- 利用sort()去重
- 利用 对象的属性不能相同的特性进行数组去重
- 利用includes()
- 利用hasOwnProperty()去重
- 利用递归去重
- 利用Map数据结构去重
利用ES6 Set()去重:
/*ES6 Set()方法数组去重*/
function unique(arr) {
//from()是将Set()数据结构转换为数组类型
//Set()数据结构类似于数组,但不同的是Set()成员值唯一
return Array.from(new Set(arr));
}
var arr =[1,1,2,3,4,4];
console.log(unique(arr));
控制台输出结果如下:
利用splice()去重:
function unique1(arr) {
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); //splice(j,1, )替换的值是空
j--;
}
}
}
return arr;
}
console.log(unique1(arr));
输出结果和上例结果一致,在这里需要注意的是splice(),它的本质是splice(index,len,[item]),index是数组开始下标,len替换删除元素的长度,[item]替换的值。
利用indexOf()去重:
function unique2(arr) {
/* 思路:1,创建新的空数组;
* 2,for循环遍历去重的数组;
* 3,indexOf()查询遍历出的数组在新的数组是否出现,如果出现则继续遍历,如果未出现,则利用push方法添加到数组里*/
var arr1 = [];
for(var i = 0; i < arr.length; i++){
if(arr1.indexOf(arr[i]) == -1){
arr1.push(arr[i]);
}
}
return arr1;
}
var array = [4,5,6,77,8,8,,77,5];
console.log(unique2(array));
注:indexOf()返回值,如果匹配到返回1,未匹配到返回-1。
控制台输出:
利用sort()去重:
/*利用sort()去重*/
function unique3(arr){
arr = arr.sort();
var array = [arr[0]];
for(var i = 1; i < arr.length; i++){ //因为不是从第一个元素开始的,所以i的初始值不能为0.
if(arr[i] !== arr[i-1]){
array.push(arr[i]);
}
}
return array;
}
var arr3 = [11,33,66,8,8,5,33,11];
console.log(unique3(arr3));
控制台输出结果:
利用 对象的属性不能相同的特性进行数组去重:
/*利用 对象的属性不能相同的特性进行数组去重*/
function unique4(arr){
var array = [];
var obj = {};
for(var i = 0; i < arr.length; i++){
if(!obj[arr[i]]){
array.push(arr[i]);
obj[arr[i]] = 1;
}else{
obj[arr[i]]++;
}
}
return array;
}
var arr4 = ['a','a','b','c','n','d','d','s','n'];
console.log(unique4(arr4));
控制台输出结果:
利用includes()去重:
/*利用includes()去重*/
function unique5(arr) {
var array = [];
for(var i = 0; i < arr.length; i++){
if(!array.includes(arr[i])){
array.push(arr[i]);
}
}
return array;
}
var arr5 = [100,50,45,90,100,4,50];
console.log(unique5(arr5));
控制台输出结果:
利用hasOwnProperty()去重:
/*利用hasOwnProperty()去重*/
function unique6(arr) {
/*hasOwnProperty去重:判断对象是否有某个特定的属性,必须用字符串指定该属性。*/
var obj = {};
/*filter()对数组中每个元素都执行一次指定的函数(callback()),并创建一个新的数组*/
return arr.filter(function (item,index,arr) {return obj.hasOwnProperty(typeof item + item)?false:(obj[typeof item + item] = true) })
//callback(当前元素,当前元素索引,当前元素数组对像)
}
var arr6 = [200,200,300,100,100,290,300];
console.log(unique6(arr6));
控制台输出结果:
利用递归去重:
/*利用递归去重*/
function unique7(arr) {
var arry = arr;
var len = arry.length;
arry.sort(function (a,b) {return a - b;})
function loop(index){
if(index >= 1){
if(arry[index]===arry[index - 1]){
arry.splice(index,1);
}
loop(index - 1);
}
}
loop(len - 1);
return arry;
}
var arr7 =[1,2,4,5,6,6,5,4,2];
console.log(unique7(arr7));
控制台输出结果:
利用Map数据结构去重:
/*利用map数据结构去重*/
function unique8(arr) {
var map = new Map();
var array = new Array();
for(var i = 0; i < arr.length; i++){
if(map.has(arr[i])){
map.set(arr[i],true);
}else{
map.set(arr[i],false);
array.push(arr[i]);
}
}
return array;
}
var arr8 = [1,1,1,2,2,2,3,3,3];
console.log(unique8(arr8));
控制台输出结果: