吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 740|回复: 5
收起左侧

[学习记录] JavaScript 前端 数组中的对象去重。

[复制链接]
w460270218 发表于 2023-3-11 16:31
[JavaScript] 纯文本查看 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      const arr = [1, 3, 2, 1, 1, 2, 3];
      const newArr = [...arr];
      //   console.log([...new Set(arr)]);
      for (let i = 0; i < newArr.length; i++) {
        for (let j = i + 1; j < newArr.length; j++) {
          if (newArr[j] === newArr[i]) {
            newArr.splice(j, 1);
            j--;
          }
        }
      }
      console.log(newArr);

      // ----------------------------------------------

      const arr2 = [
        { a: 1, b: 2 },
        { b: 2, a: 1 },
        { a: 1, b: 2, c: { a: 1, b: 2 } },
        { b: 2, a: 1, c: { b: 2, a: 1 } },
      ];
      const newArr2 = [...arr2];
      //   判断数组中的每个值是不是对象格式
      const isObject = (val) => typeof val === "object" && val !== null;
      function equals(val1, val2) {
        // 如果都是对象的话执行
        if (isObject(val1) && isObject(val2)) {
          const keys1 = Object.keys(val1),
            keys2 = Object.keys(val2);
          // 判断连个对象的长度是否一致
          if (keys1.length !== keys2.length) {
            return false;
          }
          //   循环属性名的数组
          for (const k of keys1) {
            // 判断属性名在另外的数组里面存不存在
            if (!keys2.includes(k)) {
              return false;
            }
            // 如果属性在两个对象中都有的话,递归比较
            if (!equals(val1[k], val2[k])) {
              return false;
            }
          }
          return true;
        } else {
          return val1 === val2;
        }
      }
      for (let i = 0; i < newArr2.length; i++) {
        for (let j = i + 1; j < newArr2.length; j++) {
          if (equals(newArr2[i], newArr2[j])) {
            newArr2.splice(j, 1);
            j--;
          }
        }
      }
      console.log(newArr2);
    </script>
  </body>
</html>

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

my52pojie110 发表于 2023-3-11 16:34
可以,整理的很基础
Anima-No 发表于 2023-3-11 18:41
 楼主| w460270218 发表于 2023-3-11 19:41
Anima-No 发表于 2023-3-11 18:41
这代码也太长了吧

因为不是简单的数字或者字符串去重,所以逻辑复杂了一点,不光要判断数组中是不是对象和对象的长度是否一致,还判断了键值对是否一样,并且对象中嵌套的对象也判断了,所以代码逻辑长了一些。
Anima-No 发表于 2023-3-11 20:41
w460270218 发表于 2023-3-11 19:41
因为不是简单的数字或者字符串去重,所以逻辑复杂了一点,不光要判断数组中是不是对象和对象的长度是否一 ...

const arr = [1, 3, 2, 1, 1, 2, 3];
console.log(new Set(arr));

const arr1 = [{ id: 1 }, { id: 2 }, { id: 3 }];
const arr2 = [{ id: 3 }, { id: 4 }, { id: 5 }];

function mergeArray(arr1, arr2) {
  // 克隆
  const cloneArr1 = arr1.slice(0);
  let v;
  for (let i = 0; i < arr2.length; i++) {
    v = arr2;
    // 能找到相同 id 属性值的数据则进入判断
    if (~cloneArr1.findIndex((el) => el.id === v.id)) {
      continue;
    }
    cloneArr1.push(v);
  }
  return cloneArr1;
}

console.log(mergeArray(arr1, arr2)); // [ { id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 } ]

 楼主| w460270218 发表于 2023-3-11 20:54
Anima-No 发表于 2023-3-11 20:41
const arr = [1, 3, 2, 1, 1, 2, 3];
console.log(new Set(arr));

这个方法写的有问题吧,打印的结果是不能去重的。
[
    {
        "id": 1
    },
    {
        "id": 2
    },
    {
        "id": 3
    },
    [
        {
            "id": 3
        },
        {
            "id": 4
        },
        {
            "id": 5
        }
    ]
]

我所说是将const arr2 = [
        { a: 1, b: 2 },
        { b: 2, a: 1 },
        { a: 1, b: 2, c: { a: 1, b: 2 } },
        { b: 2, a: 1, c: { b: 2, a: 1 } },
      ]
数组去重,  里面的 { a: 1, b: 2 },和 { b: 2, a: 1 },其实是重复的, { a: 1, b: 2, c: { a: 1, b: 2 } },和 { b: 2, a: 1, c: { b: 2, a: 1 } },其实也是重复的。最终打印结果应该是
[
    {
        "a": 1,
        "b": 2
    },
    {
        "a": 1,
        "b": 2,
        "c": {
            "a": 1,
            "b": 2
        }
    }
]
      
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表