2016-09-18 8 views
1

私のforループをオブジェクトの最初のプロパティの後に動作させることはできません。これは、第4章では雄弁のJavaScriptからの質問です:inループの再帰関数が完了していない

彼らは同じ値であるかの値でもある同じ プロパティを持つオブジェクトである場合にのみ、真 を2つの値を取り、返す関数、deepEqualを書きますdeepEqualの再帰的な呼び出しである と比較すると、等しいです。

IDで2つのものを比較するか(=== 演算子を使用)、またはそのプロパティを調べるには、 typeof演算子を使用できます。両方の値に「オブジェクト」が生成された場合は、 を深く比較する必要があります。しかし、あなたは アカウントに1つの愚かな例外を取らなければなりません:歴史的事故では、typeof nullも "オブジェクト"を生成します。

ここでは私のコードです:

function deepEqual(obj1, obj2) { 
    if ((typeof obj1 === 'object' && obj1 != null) && (typeof obj2 === 'object' && obj2 != null)) { 
    for (var property in obj1) { 
     if (property in obj2) { 
     return deepEqual(obj1[property], obj2[property]) 
     } else { 
     return false; 
     } 
    } 
    } else if (obj1 !== obj2) { 
    return false; 
    } else { 
    return true; 
    } 
} 

var obj = {object: 3, here: 1}; 
var obj2 = {object: 3, here: 2}; 

console.log(deepEqual(obj, obj2)); 

コンソール「ここのプロパティが一致しないので、それが偽言うべき時に、trueを返します。出力を調べるとき、関数の 'forループ'が最初のプロパティの後に終了するからです。なぜそれがループし続けていないのか教えてください。

答えて

0

あなたがその場合はその同等、または返すことをdeepEqualかのリターンをループで実行したい

for (var property in obj1) { 
     if (property in obj2) { 
     // returning means no more looping.... 
     return deepEqual(obj1[property], obj2[property]) 
     } 

deepEqual

を呼び出すときに、関数の外に戻りますので、あなたのforループは、最初のプロパティを越えて移動することはできません偽です。

+0

コメントありがとうございます!あなたの答えは理にかなっており、私は戻り値を以下のように置き換えて動作させています: 'if(!deepEqual(obj1 [property]、obj2 [property])) false false; – runandrew

関連する問題