Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step
https://juejin.cn/column/7244788137410560055
1.91k stars 232 forks source link

对象去重 #496

Open JeromeD3 opened 1 year ago

JeromeD3 commented 1 year ago
const arr = [{ a: 2 }, { a: 2 }, { a: 2, b: 1 }, { a: { b: 1, c: { a: 1 } } }, { a: { b: 1, c: { a: 1 } } }]

// want to get [ { a: 2 }, { a: 2, b: 1 }, { a: { b: 1, c: {a:1 } } } ]
mafeiGitHub commented 11 months ago

function removeDuplicates(arr) { var result = {}; // 用于存储唯一对象的空对象 for (var i = 0; i < arr.length; i++) { var objKey = JSON.stringify(arr[i]); // 将对象转换为字符串作为键 if (!result[objKey]) {//如果该键的值为空 result[objKey] = arr[i]; // 将对象添加到新的对象中作为该键的值 } } return Object.values(result); // 返回唯一对象的值作为去重后的数组 }

topulikeweb commented 3 months ago

/**
 * 对于[{ a: 2 }, { a: 2 }, { a: 2, b: 1 }, { a: { c: { a: 1 },b: 1 } }, { a: { b: 1, c: { a: 1 } } }]进行去重
 */
// 对数组进行规范化,防止因顺序不同导致判别不正确
function equalObj (obj) {
  let res = {}
  const keys = Object.keys(obj).sort()
  for (const item of keys) {
    res[item] = obj[item]
  }
  return res
}

function duplicateRemoval (arr) {
  const map = new Map()
  for (const item of arr) {
    const _obj = JSON.stringify(equalObj(item))
    if (!map.get(_obj)) {
      map.set(_obj, JSON.parse(_obj))
    }
  }
  return Array.from(map.values())
}