数组去重的几种方法
01 在原型里添加方法
在数组原型中添加一个名为unipue的方法,方法中设置一个变量用来存放去重后的数组,一个空对象(数组的索引=对象的key,数组的值=对象的value),循环数组的长度,判断数组中是否有数组的值,如果没有执行以下代码:用push在空数组中添加新值,空对象的value = 当前的值,执行完循环,返回存放数组的变量。
Array.prototype.unipue = function(){
var ret = [] // 用来存放去重后的数组
var o = {} // 空对象
for(var i=0;i<this.length;i++){
if(!o[this[i]]){
ret.push(this[i])
o[this[i]] = this[i]
}
}
return ret
}
var arr = [1,2,3,1,3,3,4,5,6,5,5,7,8,9,10,9,9,9];
var unique = arr.unique();
console.log(unique); // [1,2,3,4,5,6,7,8,9,10]
02 双重for循环去重
利用双重for循环,第一次循环确保数组中每一项都能被比较,第二层循环确保·被比较项后的每一项·都能被·比较项·比较
var arr = [1,1,2,3,4,5,3,7,8];
function removeDuplicatedItem(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) // 去除后面的相同项
j--
/* j--的原因:
每次使用splice删除元素时,返回的是一个新的数组,
这意味着这个数组下次遍历是跳过了一个元素
*/
}
}
}
return arr
}
arr2 = removeDuplicatedItem(arr);
console.log(arr2); // 去重以后的数组
03 单层循环
利用新对象来记录新数组中已经储存过的元素
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
var o = {}
var newArr = []
for(var i=0;i<arr.length;i++){
var k = arr[i] // 将当前数值赋给key
if(!o[k]){
// 如果对象的key没有当前数组值
o[k] = true
newArr.push(k) // 在新数组中添加
}
}
console.log(newArr)
04 利用indexOf + splice去重
利用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){
// 从当前位置索引删除1个元素
arr.splice(i,1)
// 数组下标减1
i--
}
}
return arr
}
var a1 = rep2(ar);
console.log(a1);
05 indexOf + push
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
function rep(arr) {
var ret = [];//空数组[存放新值/不重复]
for(var i = 0; i < arr.length; i++){
//若当前数值首次出现的下标 = 循环的下标
if(arr.indexOf(arr[i]) == i) {
// 则在新数组中添加当前数值
ret.push(arr[i]);
}
}
return ret;
}
arr2 = rep(arr);
console.log(arr2);
06 filter + indexOf
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);