js实现数组去重(方式大汇总)

方法一:循环判断当前元素与其后面所有元素对比是否相等,如果相等删除;(执行速度慢)

var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5];
function removeDuplicatedItem(arr) {
for(var i = 0; i < arr.length-1; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i]==arr[j]){
arr.splice(j,1);//console.log(arr[j]);
j--;
}
}
}
return arr;
} arr2 = removeDuplicatedItem(arr);
console.log(arr);
console.log(arr2);

方法二:借助新数组 判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中

function unique4(arr){
var res = [];
for(var i=0; i<arr.length; i++){
if(res.indexOf(arr[i]) == -1){
res.push(arr[i]);
}
}
return res;
} console.log(unique4([1,1,2,3,5,3,1,5,6,7,4]));

方法三:利用对象属性存在的特性,如果没有该属性则存入新数组。

function unique3(arr){
var res = [];
var obj = {};
for(var i=0; i<arr.length; i++){
if( !obj[arr[i]] ){
obj[arr[i]] = 1;
res.push(arr[i]);
}
}
return res;
}
console.log(unique3([1,1,2,3,5,3,1,5,6,7,4]));

方法四:先将原数组排序,在与相邻的进行比较(新数组最后一个元素),如果不同则存入新数组。

function unique2(arr){
var arr2 = arr.sort();
var res = [arr2[0]];
for(var i=1; i<arr2.length; i++){
if(arr2[i] !== res[res.length-1]){
res.push(arr2[i]);
}
}
return res;
} console.log(unique2([1,1,2,3,5,3,1,5,6,7,4]));

方法五:定义一个新数组,并存放原数组的第一个元素,然后将元素组一一和新数组的元素对比,若不同则存放在新数组中

function unique(arr){
var res = [arr[0]];
for(var i=1; i<arr.length; i++){
var repeat = false;
for(var j=0; j<res.length; j++){
if(arr[i] === res[j]){
repeat = true;
break;
}
}
if(!repeat){
res.push(arr[i]);
}
}
return res;
} console.log(unique([1,1,2,3,5,3,1,5,6,7,4]));

方法六:利用数组原型对象上的includes方法。

function unique5(arr){
var res = []; for(var i=0; i<arr.length; i++){
if( !res.includes(arr[i]) ){ // 如果res新数组包含当前循环item
res.push(arr[i]);
}
}
return res;
} console.log(unique5([1,1,2,3,5,3,1,5,6,7,4]));

方法七:利用数组原型对象上的 lastIndexOf 方法。

function unique9(arr){
var res = [];
for(var i=0; i<arr.length; i++){
res.lastIndexOf(arr[i]) !== -1 ? '' : res.push(arr[i]);
}
return res;
} console.log(unique9([1,1,2,3,5,3,1,5,6,7,4]));

方法八:利用 ES6的set 方法。

function unique10(arr){
//Set数据结构,它类似于数组,其成员的值都是唯一的
return Array.from(new Set(arr)); // 利用Array.from将Set结构转换成数组
}
console.log(unique10([1,1,2,3,5,3,1,5,6,7,4]));

方法九:借助indexOf()方法判断此元素在该数组中首次出现的位置下标与循环的下标是否相等

var ar = [1,23,1,1,1,3,23,5,6,7,9,9,8,5];
function rep2(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) != i) {
arr.splice(i,1);//删除数组元素后数组长度减1后面的元素前移
i--;//数组下标回退
}
}
return arr;
}
var a1 = rep2(ar);
console.log(ar);
console.log(a1);

方法十:利用数组中的filter方法

var arr = ['apple','strawberry','banana','pear','apple','orange','orange','strawberry'];
var r = arr.filter(function(element,index,self){
return self.indexOf(element) === index;
});
console.log(r);

方法十一:双重循环,判断当前元素是否与后边元素有重复,如果没有重复,push进新数组,有重复则将重复元素中最后一个元素push进新数组

var arr = [12, 2, 44, 3, 2, 32, 33, -2, 45, 33, 32, 3, 12];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
var repArr = [];//接收重复数据后面的下标
//内层循环找出有重复数据的下标
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
repArr.push(j);//找出后面重复数据的下标
}
}
//console.log(repArr);
if (repArr.length == 0) {//若重复数组没有值说明其不是重复数据
newArr.push(arr[i]);
}
}
console.log(newArr);//[ 44, 2, -2, 45, 33, 32, 3, 12 ]
上一篇:js笔记---(运动)通用的move方法,兼容透明度变化


下一篇:第三方登录插件.NET版XY.OAuth-CSharp