码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 对象数组去重


    针对去重问题,有这么几种解决方式,如Set,for循环遍历属性值等。

    问题如下:

    1. // 对象数组去重,只要对象的所有属性值相同,则表示相同对象。
    2. const arr = [
    3. { a: 1, b: 2 },
    4. { b: 2, a: 1 },
    5. { a: 1, b: 2, c: { a: 1, b: 2 } },
    6. { b: 2, a: 1, c: { b: 2, a: 1 } },
    7. ];

    如果使用Set去重,则不会去掉对象属性顺序不一致的一项,因为对象obj1与 obj2两者所引用的地址不同,js判断为不同的对象。

    const newArr = [...new Set(arr)];
    1. obj1 = {
    2. a: 1,
    3. b: 2
    4. };
    5. obj2 = {
    6. b: 2,
    7. a: 1
    8. };
    9. console.log('obj === obj2: ', obj === obj2); // false

     使用传统嵌套for循环判断:

    1. const newArr = [...arr];
    2. for (let i = 0; i < newArr.length; i++) {
    3. for (let j = i + 1; j < newArr.length; j++) {
    4. // 判断条件 newArr[i] === newArr[j]
    5. if (JSON.stringify(newArr[i]) === JSON.stringify(newArr[j])) {
    6. newArr.splice(j, 1);
    7. j--;
    8. }
    9. }
    10. }

    其输出结果也不符合要求,不过我们可以以此为基础,在条件判断上做文章。

    代码大体思路实现如下:

    1. const isObject = val => typeof val === 'object' && val != null;
    2. function equals(val1, val2) {
    3. if (!isObject(val1) || !isObject(val2)) {
    4. return Object.is(val1, val2);
    5. }
    6. if (val1 === val2) return true;
    7. const val1Keys = Object.keys(val1);
    8. const val2Keys = Object.keys(val2);
    9. if (val1Keys.length != val1Keys.length) return false;
    10. for (const key of val1Keys) {
    11. if (!val2Keys.includes(key)) return false;
    12. const res = equals(val1[key], val2[key]);
    13. if (!res) return false; // 只要有一个属性值不一样,返回false
    14. console.log('res: ', res);
    15. }
    16. }

    解释:isObject函数用来判断某个值是否为对象,equals函数用来比较两个值是否相同,包括属性名相同但顺序不同的情况。

    Object.is()是ECMAScript 6中的一个新方法,用于比较两个值是否相等,参考MDN。

    知识的掌握程度决定了你有多少种选择,每天进步一点点。 

  • 相关阅读:
    Chrome 浏览器关闭后再打开,需要重新登录账号,解决办法
    Java 并发编程之CAS 和 Unsafe类本地使用方法
    Java案例:打印折纸的次数
    给工资低的朋友6个搞钱建议,作为副业,闷声发小财
    天才在左,疯子在右读书笔记 -- 高铭著
    cost function 成本函数
    shell 脚本发布前后端代码
    为什么用php的人越来越少了?
    问题随记 —— PyCharm 连接远程服务器的 Python 环境
    5G建网初期SSB波束设置策略
  • 原文地址:https://blog.csdn.net/weixin_45719444/article/details/133590248
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号