一、数组的去重
简单类型的去重
let arr = [1, 2, 2, 3, 4, 4, 5];
let uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]
在这个例子中,我们首先创建了一个新的 Set 对象,并将数组 arr 作为参数传递给 Set 的构造函数。这会创建一个新的 Set 对象,其中包含 arr 中的所有唯一值。然后,我们使用扩展运算符 … 将 Set 对象转换回数组。
(ps: 如果你的数组中包含对象,那么这种方法可能无法正确地去重,因为 Set 使用的是严格相等性检查 (===),所以 {} 和 {} 是不相等的。在这种情况下,你可能需要使用其他方法来去重。)
数组中包含对象的去重
如果数组中包含的对象,属性的顺序不同,但是属性值一样,我们仍然认为它们是相同的,那么我们可以先对对象的属性进行排序,然后再进行去重。
let arr = [
{ id: 1, name: 'Tom' },
{ name: 'Jerry', id: 2 },
{ id: 1, name: 'Tom' },
{ id: 3, name: 'Spike' },
{ name: 'Jerry', id: 2 }
];
let uniqueArr = Array.from(
new Set(
arr.map(item => {
return JSON.stringify(
Object.keys(item)
.sort()
.reduce((result, key) => {
result[key] = item[key];
return result;
}, {})
);
})
)
).map(item => JSON.parse(item));
console.log('uniqueArr', uniqueArr);
在这个例子中,我们首先使用 Array.prototype.map 对数组中的每个对象进行处理。对于每个对象,我们先获取它的所有属性名,然后对属性名进行排序,然后使用 Array.prototype.reduce 创建一个新的对象,这个新的对象的属性是按照排序后的顺序添加的。然后我们将这个新的对象转换为字符串。
然后,我们使用 Set 来去重。最后,我们再次使用 Array.prototype.map 和 JSON.parse 将字符串转换回对象。
可以优化作为一个函数抛出
export function getUniqueObjArr(arr: any[]) {
let uniqueArr = Array.from(
new Set(
arr.map((item: any) => {
return JSON.stringify(
Object.keys(item)
.sort()
.reduce((result: any, key) => {
result[key] = item[key]
return result
}, {}),
)
}),
),
).map(item => JSON.parse(item))
console.log('uniqueArr==', uniqueArr)
return uniqueArr
}