JS数组去重

320 阅读1分钟

JS数组去重是前端面试,常考察的一道题,你会几种方法呢?如果你有更好的方法,可以在文章下放评论区提供。 接下来看看8种数组去重方法,每个方法都在一个块级作用域中,有方法和测试用例。方便你更好的测试和理解。

方法一 For嵌套for

遇到删掉 原数组递减1

var arr = [1, 1, 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); 
				j--;
			}
		}
	}
	return arr;
}
arr2 = removeDuplicatedItem(arr);
console.log(arr2);

方法二 indexOf()去重

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

var ar = [1, 213, 1,22132113, 232,123,3123,131111];
console.log(ar);
function rep2(arr) {
	for(var i = 0; i < arr.length; i++) {
		if(arr.indexOf(arr[i]) != i) {
			//删除数组元素后数组长度减1后面的元素前移
			arr.splice(i, 1); 
			//数组下标回退
			i--; 
		}
	}
	return arr;
}
var a1 = rep2(ar);
console.log(a1);

方法三 利用self()去重

var arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
var r = arr.filter(function(element, index, self) {//element 元素  index:索引  self 数组
	return self.indexOf(element) === index;
});
console.log(r);

方法四 通过indexOf方判断

借助新数组 通过indexOf方判断当前元素在数组中的索引如果与循环的 下标相等则添加到新数组中

var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
//console.log(arr);
function rep(arr) {
	var ret = [];//空数组[存放新值/不重复]
	for (var i = 0; i < arr.length; i++) {
		if (arr.indexOf(arr[i]) == i) {
			ret.push(arr[i]);
			//console.log(ret);//观察ret动态
		}
	}
	return ret;
}
arr2 = rep(arr);
console.log(arr2);

方法五 利用空对象来记录新数组中已经存储过的元素

var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
var o = {};      //
var new_arr = [];//新数组
for(var i = 0; i < arr.length; i++) {
	var k = arr[i];
	if(!o[k]) {
		o[k] = true;
		new_arr.push(k);
	}
}
console.log(new_arr);