• 对象数组去重


    针对去重问题,有这么几种解决方式,如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

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

  • 相关阅读:
    uni-app多端开发
    Redis解决缓存穿透,缓存雪崩,缓存击穿思路
    数据结构 | 数据结构的“基本概念”和“术语”
    355. 设计推特 -- 合并k个有序链表的应用
    Android12 am命令的使用及实现流程分析
    微信点餐小程序项目 --- 干饭人联盟(开源、免费)
    3 款非常实用的 Node.js 版本管理工具
    pycharm更改远程服务器地址
    LaTeX 数学公式常见问题及解决方案
    华纳云服务器怎么清理cdn缓存?
  • 原文地址:https://blog.csdn.net/weixin_45719444/article/details/133590248