数组里对象的去重方式有很多种,在此仅分享代码简洁、简单的两种。
一、Set去重
1、由于对象存储的是地址,无法直接进行比较,所以使用JSON.stringify()将对象转成字符串
2、利用Set对象元素唯一的特性,对序列化后的数组对象进行去重
3、最后将去重后的数组进行反序列化
var arr = [ {a: 1,b: 2}, {a: 2,b: 2}, {a: 1,b: 2}]
// 对象序列化
arr = arr.map(x => { return JSON.stringify(x) })
// 1、不取相同元素下标数组去重
arr = Array.from(new Set(arr))
// 2、取相同元素下标并去重数组
var set = new Set()
var save = [] // 用于存储相同元素下标
arr.forEach((x, i) => {
// 判断set对象里是否存在x
// 存在:
// 1. indexof取相同元素中第一个的下标
// 2. i:相同元素中第二个的下标
// 3. 存入save数组
// 不存在:往set对象中添加
set.has(x) ? save.push([arr.indexOf(x), i]) : set.add(x)
})
var res = Array.from(set)
// 反序列化
res = res.map(x => { return JSON.parse(x) })
console.log(res, save)
二、filter + indexOf去重
// filter + indexOf去重
var arr = [1, 1, 2, 3, 5, 3]
arr = arr.filter((item, index) => arr.indexOf(item) === index)