美文网首页
js|分享一个比较两个对象是否相等的工具类

js|分享一个比较两个对象是否相等的工具类

作者: 你家门口的两朵云 | 来源:发表于2021-09-27 17:28 被阅读0次

教程来自某简书小友,链接不记得了,遂未放;

compareUtils.js

/**
 * 判断对象x,和对象y是否相等;
 * @param x
 * @param y
 * @returns {boolean}
 */
export const compare = function deepCompare(x, y) {
    let i, l, leftChain, rightChain;

    function compare2Objects(x, y) {
        let p;

        // remember that NaN === NaN returns false
        // and isNaN(undefined) returns true
        if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
            return true;
        }

        // Compare primitives and functions.
        // Check if both arguments link to the same object.
        // Especially useful on the step where we compare prototypes
        if (x === y) {
            return true;
        }

        // Works in case when functions are created in constructor.
        // Comparing dates is a common scenario. Another built-ins?
        // We can even handle functions passed across iframes
        if ((typeof x === 'function' && typeof y === 'function') ||
            (x instanceof Date && y instanceof Date) ||
            (x instanceof RegExp && y instanceof RegExp) ||
            (x instanceof String && y instanceof String) ||
            (x instanceof Number && y instanceof Number)) {
            return x.toString() === y.toString();
        }

        // At last checking prototypes as good as we can
        if (!(x instanceof Object && y instanceof Object)) {
            return false;
        }

        if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
            return false;
        }

        if (x.constructor !== y.constructor) {
            return false;
        }

        if (x.prototype !== y.prototype) {
            return false;
        }

        // Check for infinitive linking loops
        if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
            return false;
        }

        // Quick checking of one object being a subset of another.
        // todo: cache the structure of arguments[0] for performance
        for (p in y) {
            if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
                return false;
            } else if (typeof y[p] !== typeof x[p]) {
                return false;
            }
        }

        for (p in x) {
            if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
                return false;
            } else if (typeof y[p] !== typeof x[p]) {
                return false;
            }

            switch (typeof (x[p])) {
                case 'object':
                case 'function':

                    leftChain.push(x);
                    rightChain.push(y);

                    if (!compare2Objects(x[p], y[p])) {
                        return false;
                    }

                    leftChain.pop();
                    rightChain.pop();
                    break;

                default:
                    if (x[p] !== y[p]) {
                        return false;
                    }
                    break;
            }
        }

        return true;
    }

    if (arguments.length < 1) {
        return true; //Die silently? Don't know how to handle such case, please help...
        // throw "Need two or more arguments to compare";
    }

    for (i = 1, l = arguments.length; i < l; i++) {

        leftChain = []; //Todo: this can be cached
        rightChain = [];

        if (!compare2Objects(arguments[0], arguments[i])) {
            return false;
        }
    }

    return true;
}

相关文章

  • js|分享一个比较两个对象是否相等的工具类

    教程来自某简书小友,链接不记得了,遂未放; compareUtils.js

  • Objective-C 判断对象是否相等

    对象是否相等 直接比较两个对象是否相等,实际上比较的是两个对象的指针是否相等。上述代码中str1和str2是分别指...

  • js 对象和对象比较是否相等

  • 对象比较

    关于对象比较的实现模式;this在对象比较中的应用。 问题: 如果一个自定义类,要想判断它的两个对象是否相等,那么...

  • iOS 快看漫画面试整理

    1, 如何判断两个对象相等 先判断是否为nil,然后比较对象的地址(用==),然后判断两个对象是否是同一个类(用i...

  • Python3 ==和is

    == != 比较的是对象的值是否相等 is isnot 比较的是对象的id是否相等(比较是否是同一个对象) a =...

  • Java中==和equals的区别,equals和hashCod

    在java中: ==是运算符,用于比较两个变量是否相等。 equals,是Objec类的方法,用于比较两个对象是否...

  • java中==和equals和hashCode的区别

    “==”: ==是运算符,用来 比较两个值是否相等(基本数据类型)、比较两个对象的内存地址是否相等(对象); “...

  • is和==的区别

    is 是比较两个引用是否指向了同一个对象(引用比较)。 == 是比较两个对象是否相等。

  • 高编-深浅拷贝

    总结: ·is是比较两个引用是否指向了同一个对象(地址引用比较)。 ·==是比较两个对象是否相等。(比较的数值)

网友评论

      本文标题:js|分享一个比较两个对象是否相等的工具类

      本文链接:https://www.haomeiwen.com/subject/scsrnltx.html