// 基于单key或无key去重,单key一般是对象的id,无key就是元素本身是非对象
export function uniqueArr(arr, key){
let res;
if(key){
res = [...new Map(arr.map(t => [t[key], t])).values()]
}
else{
res = [...new Set(arr)]
}
return res;
}
// 另一种基于单key的去重,基于Set
function uniqueArr(arr, key){
const res = new Set();
return arr.filter( item => !res.has(item[key]) && res.add(item[key]) );
}
// 非单key,对象进行全键比较,若对象内无特殊类型,且键顺序一致,则可以简单用JSON.stringify来比较
function uniqueArr(arr) {
const set = new Set();
return arr.filter((item) => {
const strItem = JSON.stringify(item);
if (set.has(strItem)) return false;
set.add(strItem);
return true;
});
}
// 非单key,对象进行全键比较,使用递归进行深比较
function uniqueArr(arr) {
return arr.filter((item, index) => {
return index === arr.findIndex(other => deepEqual(item, other));
})
}
function deepEqual(obj1, obj2) {
if (obj1 === obj2) return true;
if (typeof obj1 !== "object" || typeof obj2 !== "object" || obj1 === null || obj2 === null) {
return false;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) return false;
for (const key of keys1) {
if (!keys2.includes(key)) return false;
if (!deepEqual(obj1[key], obj2[key])) return false;
}
return true;
}