题目:给定一个对象数组,写一个函数对该数组去重,函数需带有两个参数,第一个参数为需要去重的数组,第二个参数是一个包含一个或多个对象属性的数组,根据指定的属性进行去重。
做这道题之前我们先来回顾某些知识点:
1、深拷贝和浅拷贝
浅拷贝:只拷贝一层,后面均为引用
深拷贝:多层拷贝
let arr1 = [1,2,3,4,5,6,7,8]
let newArr = []
let newArr = arr1 //直接引用,非拷贝
Object.assign(newArr, arr1) //浅拷贝(es6的
//深拷贝(利用JSON,有问题1、会丢失function和undefined 2、NaN、Infinity会变成null
let newArr = JSON.parse(JSON.stringify(arr1))
2、js中对象属性调用 . 和 [ ] 的区别
一句话总结:[ ]里可以跟变量,而 . 后只能跟字符串。如果对象的key是symbol类型,则只能通过[ ]来调用。
下面开始解题:
let arrList = [
{id:1,name:'a',sex:male},
{id:2,name:'b',sex:male},
{id:3,name:'c',sex:female},
{id:4,name:'d',sex:female},
{id:1,name:'a',sex:male},
{id:2,name:'c',sex:male},
{id:3,name:'b',sex:female},
{id:5,name:'d',sex:female},
{id:5,name:'e',sex:male},
{id:5,name:'f',sex:male}
]
function unique(arr, paramList) {
const res = new Map()
for (let i = 0; i < paramList.length; i++) {
arr = arr.filter(temp => !res.has(temp[paramList[i]]) && res.set(temp[paramList[i]]))
}
return arr
}
console.log(JSON.stringify(arrList)) //原数组
console.log('-----------------------------------------------')
let arr1 = unique(arrList, ['id', 'name'])
console.log(JSON.stringify(arr1)) //去掉了id和name重复的元素
console.log('-----------------------------------------------')
let arr2 = unique(arrList, ['id', 'name', 'sex'])
console.log(JSON.stringify(arr2)) //去掉了id,name,sex重复的元素
结果: