国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

深度比較兩個(gè)javaScript對(duì)象

go4it / 2395人閱讀

摘要:深度比較兩個(gè)對(duì)象寫(xiě)在前面近日遇到的一個(gè)需求需要比較兩個(gè)對(duì)象,對(duì)象的屬性類(lèi)型相同,屬性的值相同,就認(rèn)為是兩個(gè)對(duì)象是相同的,唯恐自己寫(xiě)的方法不夠精煉,因此找到了解決辦法,特此記下。

深度比較兩個(gè)javaScript對(duì)象 1、寫(xiě)在前面
近日遇到的一個(gè)需求需要比較兩個(gè)對(duì)象,對(duì)象的屬性類(lèi)型相同,屬性的值相同,就認(rèn)為是兩個(gè)對(duì)象是相同的,唯恐自己寫(xiě)的方法不夠精煉,因此google找到了解決辦法,特此記下。
方法出處:http://stackoverflow.com/questions/1068834/object-comparison-in-javascript
2、方法一:Object.toJSON()或 JSON.stringify()
此方法簡(jiǎn)單,適用于當(dāng)兩個(gè)對(duì)象的屬性順序相同的時(shí)候。
var user1 = {name : "nerd", org: "dev"};
var user2 = {name : "nerd", org: "dev"};
var eq = user1 == user2;
alert(eq); // gives false

// var eq1 = Object.toJSON(user1) == Object.toJSON(user2);
var eq1 = JSON.stringify(user1) === JSON.stringify(user2)
alert(eq1); // gives true
3、方法二、深度比較兩個(gè)對(duì)象(推薦)
深度比較兩個(gè)對(duì)象,當(dāng)對(duì)象的屬性類(lèi)型相同且屬性的值相同(對(duì)象的順序可以不一樣),兩個(gè)對(duì)象就相等。
    function deepCompare(x, y) {
        var i, l, leftChain, rightChain;

        function compare2Objects(x, y) {
            var 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;
    }

可以把方法compare2Objects修改成自己想要的條件,比如說(shuō)不限制屬性的類(lèi)型,只要屬性的值相等就認(rèn)為兩個(gè)object相等。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81322.html

相關(guān)文章

  • 淺析虛擬dom原理并實(shí)現(xiàn)

    摘要:虛擬原理流程簡(jiǎn)單概括有三點(diǎn)用模擬樹(shù),并渲染這個(gè)樹(shù)比較新老樹(shù),得到比較的差異對(duì)象把差異對(duì)象應(yīng)用到渲染的樹(shù)。下面是流程圖下面我們用代碼一步步去實(shí)現(xiàn)一個(gè)流程圖用模擬樹(shù)并渲染到頁(yè)面上其實(shí)虛擬,就是用對(duì)象結(jié)構(gòu)的一種映射,下面我們一步步實(shí)現(xiàn)這個(gè)過(guò)程。 背景 大家都知道,在網(wǎng)頁(yè)中瀏覽器資源開(kāi)銷(xiāo)最大便是DOM節(jié)點(diǎn)了,DOM很慢并且非常龐大,網(wǎng)頁(yè)性能問(wèn)題大多數(shù)都是有JavaScript修改DOM所引起的...

    charles_paul 評(píng)論0 收藏0
  • 深度剖析:如何實(shí)現(xiàn)一個(gè) Virtual DOM 算法

    摘要:本文所實(shí)現(xiàn)的完整代碼存放在。這就是所謂的算法。兩個(gè)樹(shù)的完全的算法是一個(gè)時(shí)間復(fù)雜度為的問(wèn)題。如果有差異的話就記錄到一個(gè)對(duì)象里面。如和的不同,會(huì)被所替代。這牽涉到兩個(gè)列表的對(duì)比算法,需要另外起一個(gè)小節(jié)來(lái)討論。 作者:戴嘉華 轉(zhuǎn)載請(qǐng)注明出處并保留原文鏈接( https://github.com/livoras/blog/issues/13 )和作者信息。 目錄: 1 前言 2 對(duì)前端應(yīng)用狀...

    vvpvvp 評(píng)論0 收藏0
  • 使用JavaScript完成二叉樹(shù)的一些基本操作

    摘要:另外,由于篇幅有限,本篇的重點(diǎn)在于二叉樹(shù)的常見(jiàn)算法以及實(shí)現(xiàn)。常見(jiàn)的二叉樹(shù)實(shí)現(xiàn)代碼之前寫(xiě)過(guò)相關(guān)的文章,是關(guān)于如何創(chuàng)建及遍歷二叉樹(shù)的,這里不再贅述。同時(shí)我們注意到,在二叉樹(shù)深度比較大的時(shí)候,我們光是比較左右是不夠的。 本篇為復(fù)習(xí)過(guò)程中遇到過(guò)的總結(jié),同時(shí)也給準(zhǔn)備面試的同學(xué)一份參考。另外,由于篇幅有限,本篇的重點(diǎn)在于二叉樹(shù)的常見(jiàn)算法以及實(shí)現(xiàn)。 常見(jiàn)的二叉樹(shù)實(shí)現(xiàn)代碼 之前寫(xiě)過(guò)相關(guān)的文章,是關(guān)于如...

    YPHP 評(píng)論0 收藏0
  • js對(duì)象詳解(JavaScript對(duì)象深度剖析,深度理解js對(duì)象)

    摘要:對(duì)象詳解對(duì)象深度剖析,深度理解對(duì)象這算是醞釀很久的一篇文章了。用空構(gòu)造函數(shù)設(shè)置類(lèi)名每個(gè)對(duì)象都共享相同屬性每個(gè)對(duì)象共享一個(gè)方法版本,省內(nèi)存。 js對(duì)象詳解(JavaScript對(duì)象深度剖析,深度理解js對(duì)象) 這算是醞釀很久的一篇文章了。 JavaScript作為一個(gè)基于對(duì)象(沒(méi)有類(lèi)的概念)的語(yǔ)言,從入門(mén)到精通到放棄一直會(huì)被對(duì)象這個(gè)問(wèn)題圍繞。 平時(shí)發(fā)的文章基本都是開(kāi)發(fā)中遇到的問(wèn)題和對(duì)...

    CatalpaFlat 評(píng)論0 收藏0
  • JavasScript重難點(diǎn)知識(shí)

    摘要:忍者級(jí)別的函數(shù)操作對(duì)于什么是匿名函數(shù),這里就不做過(guò)多介紹了。我們需要知道的是,對(duì)于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...

    forsigner 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<