数组去重方法总结

// 基于单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;
}
posted @ 2023-06-01 15:22  全玉  阅读(13)  评论(0编辑  收藏  举报