数组去重以及数组对象去重方法总结
一、数组对象去重
1、reduce方法
原理,新创建一个空对象,然后利用reduce函数的特性,先看一下这个对象里是否有这个id,如果有则跳过,没有将当前值加入preval,并且赋给这个新创建的对象,最终返回的preval一定是去重后的数组对象。
let arr = [
{
id: 1, name: '周瑜'},
{
id: 3, name: '王昭君'},
{
id: 2, name: '亚瑟'},
{
id: 1, name: '小乔'},
{
id: 2, name: '大桥'},
{
id: 3, name: '韩信'}
];
let obj = {
}
arr = arr.reduce((preVal,curVal) => {
obj[curVal.id] ? "" : obj[curVal.id] = preVal.push(curVal)
return preVal
},[])
console.log(arr)
2、利用原生js+空对象+空数组
原理,其实和方法一的原理差不多,只不过是通过原生的for循环进行遍历,也是利用新对象去判断是否已经有该值。
let arr = [
{
id: 1, name: '周瑜'},
{
id: 3, name: '王昭君'},
{
id: 2, name: '亚瑟'},
{
id: 1, name: '小乔'},
{
id: 2, name: '大桥'},
{
id: 3, name: '韩信'}
];
//方法二
function distinct(arr,key) {
let newObj = {
}
let newArr = []
for(let i=0; i< arr.length; i++) {
let temp = arr[i]
if(!newObj[temp[key]]) {
newObj[temp[key]] = newArr.push(temp)
}
}
console.log(newArr)
return newArr
}
distinct(arr,'id')
3、利用原生js+标志位+空数组
原理,其实和上面的方法差不多,上面的方法是利用空对象去做判断是否已经有过某一项,而这个方法是利用flag标志和空数组去判断是否有过某一项。
let arr = [
{
id: 1, name: '周瑜'},
{
id: 3,