JavaScript の楽しい質問: オブジェクトの詳細な比較

黄舟
リリース: 2017-01-22 14:38:09
オリジナル
1669 人が閲覧しました

JavaScript で 2 つのオブジェクトを比較するのは簡単な作業ではなく、JavaScript 自体はそのような API を提供しません。

「==」演算子を使用して 2 つのオブジェクトを比較したい場合、それは完全に間違っています。

「==」演算子は、左右の変数が同じオブジェクトを指している場合にのみ true を返します。

例えば以下の例では必ずfalseが返されます。

var a = { name: 'Joe' };  
var b = { name: 'Joe' };  
a == b;  //-> false
ログイン後にコピー

では、2 つのオブジェクトを比較する基準は何でしょうか?

1. それらは同じ属性名を持っていますか?

2. それらは同じ属性値を持っていますか? たとえば、上の 2 つのオブジェクト a と b は「name」と「Joe」という属性値を持っています。 「似ている」と言えるでしょう。

つまり、今回の目的は、2つのJSオブジェクトが「似ている」かどうかを判断することです。

上記の 2 つのオブジェクトは非常に単純ですが、オブジェクトが入れ子になっている状況に遭遇すると、複雑になります。

オブジェクトには通常のオブジェクト、関数オブジェクト、日付オブジェクトなど多くの種類があるため、それらを比較するとプログラムの複雑さが増加します。したがって、ここでは通常のオブジェクト ({})、配列のいくつかのケースのみを考慮します。オブジェクト ([]) と単純な基本型 (文字列、数値、ブール値、null、未定義)。

要件が単純化されたとしても、この比較を実行するのは簡単ではありません。以下では、オブジェクトの詳細なトラバースを使用して、オブジェクトの属性名と値を 1 つずつ比較します。

function deepCompare(o1, o2) {  
    //标识是否相似  
    var flag = true;  
      
    var traverse = function(o1,o2){  
        //如果至少有一个不是对象  
        if(!(o1 instanceof Object) || !(o2 instanceof Object)){  
            if(o1 !== o2){  
                flag = false;  
            }  
            return;  
        }  
        //如果两个对象的属性数量不一致  
        //比如:  
        //a:{name:"Jack",age:22}  
        //b:{name:"Jack"}  
        if(Object.keys(o1).length != Object.keys(o2).length){  
            flag = false;  
        }  
        //若有不同之处,尽早结束递归  
        if(flag){  
            //深度遍历对象  
            for(var i in o1){  
                //若都是对象,继续递归  
                if(typeof o1[i] === "object" && typeof o2[i] === "object"){  
                    traverse(o1[i],o2[i]);  
                }//若都不是对象,则比较值  
                else if(typeof o1[i] !== "object" && typeof o2[i] !== "object"){  
                    if(o1[i] !== o2[i]){  
                        flag = false;;  
                    }  
                }//一个是对象,一个不是对象,肯定不相似  
                else{  
                    flag = false;  
                }  
            }  
        }  
    };  
      
    traverse(o1,o2);  
      
    return flag;  
};
ログイン後にコピー

上記は JavaScript の興味深い質問の内容です: オブジェクトの詳細な比較 詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート