1、数组去重可以使用filter,去掉数组的重复项
例如
let arr = [1,2,2,3,4,5,6,null,null].filter((item,index,arr) => arr.indexOf(item)===index)
console.log(arr)
对filter延伸
一、作用
filter用于对数组进行过滤。
它创建一个新数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
filter()不会对空数组进行检测、不会改变原始数组
二、语法
Array.filter(function(currentValue,index,arr){return{}})
2、使用new Set 去重更简单
let arr = [...new Set([1, 2, 2, 4, null, null])]
console.log(arr)
new Set() 的延伸
Set是es6 新增的数据结构,似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合。Set本身是一个构造函数,用来生成Set数据结构
new Set()生成出来的数据是Set数据结构,需要自行转换成对应结构
可以用于数组去重
也可以用于字符串去重
字符串去重
.new Set方法,返回是一个类数组,需要结合 Array.from ,转成真实数组
3、reduce 其实也可以实现去重
const arr = [{
id: 1,
phone: 1880001,
name: 'wang',
},{
id: 2,
phone: 1880002,
name: 'li',
},{
id: 3,
phone: 1880001,
name: 'wang',
}]
let hash = {};
return arr.reduce((totalItem, currItem) => {
hash[currItem.phone]? null : hash[currItem.phone] = true && totalItem.push(currItem);
return totalItem;
}, []);
主要思路是利用数组的去重中对象的不重名属性
首先弄一个空对象hash, 然后把对象的属性phone当做hash的key来用
第一次执行先把初始值[]传进去,所以此时totalItem是[],判断hash[currItem.phone]存不存在,第一次肯定不存在,所以把currItem.phone作为hash的一个属性,并赋值为true或把它的值赋值,并执行totalItem.push(currItem)及[].push(currItem),后面的判断同理,检查hash中的currItem.phone,存在就为null什么都不操作,不存在说明totalItem中也不存在,所以赋值并push即可;
reduce在上篇的文章中已做了详细介绍,这里不做过多解释
4、for + object。利用对象属性名不能重复这一特点。如果对象中不存在,就可以给 push 进去
var arr = [1,2,3,4,3,2,3]
// 数组去重:
// 方法8 :for + obj
function newArrFn (arr) {
// 利用对象属性名不能重复这一特点
// 如果对象中不存在,就可以给 push 进去
let newArr = []
let obj = {}
for(let i = 0;i<arr.length;i++){
if (!obj[arr[i]]) {
newArr.push(arr[i])
obj[arr[i]] = 1
} else {
obj[arr[i]] ++
}
};
return newArr
}
console.log(newArrFn(arr));
5、Map 方法去重
var arr = [1,2,3,4,4,4,5]
// 数组去重:
// 方法11 :Map
function newArrFn (arr) {
let newArr = []
let map = new Map()
for(let i = 0;i<arr.length;i++){
// 如果 map里面不包含,就设置进去
if (!map.has(arr[i])) {
map.set(arr[i], true)
newArr.push(arr[i])
}
};
return newArr
}
console.log(newArrFn(arr));