2016-07-30 4 views
0

私はEloquent Javascriptの本からJavascriptを学んでいます。私は私のコードは、第4章でディープ比較行使のために(オブジェクトへの導入)深い比較(Eloquent Javascript Chapter 4):コードがテストケースに失敗する

関数を書く

ゴールを失敗したかについて少し困惑だ、2つの値をとり、deepEqualは、trueを返します それらが同じ値であるか、または同じ のプロパティを持つオブジェクトである場合にのみ、再帰的な のdeepEqualの呼び出しと比較した場合の値も同じです。

IDで2つのものを比較するか(=== 演算子を使用)、またはそのプロパティを調べるには、 typeof演算子を使用できます。両方の値に「オブジェクト」が生成された場合は、 を深く比較する必要があります。

いくつかのデバッグを通して私のコード

function deepEqual(obj1, obj2) 
{ 
    var truefalse = undefined; 
    var type1 = typeof obj1; 
    var type2 = typeof obj2; 

// In case both are objects 
    if(type1 == 'object' && type2 == 'object') 
    { 
     var prop1 = []; 
     var prop2 = []; 
     for(var prop in obj1) 
      prop1.push(prop); 
     for(var prop in obj2) 
      prop2.push(prop); 

     // Test if both objects have the same number of properties 
     if(prop1.length == prop2.length) 
     { 

      // Test if all properties between them have the same names, 
      // by generating index for each property in prop1 against prop2 
      var indexArray = []; 
      for(var i = 0; i < prop1.length; i++) 
      { 
       var index = prop2.indexOf(prop1[i]); 
       indexArray.push(index); 
      }; 

      // If there's no "-1" anywhere in the indices generated 
      // (all properties are named the same between them), 
      // move on to value comparison for each property 
      if(indexArray.indexOf(-1) == -1) 
       { 
       for(var event in obj1) 
        { 
         if(deepEqual(obj1[event], obj2[event])) 
          truefalse = true 
         else 
          truefalse = false; 
        }; 
       } 

      // Different property names 
      else 
       truefalse = false; 
     } 

     // Different number of properties 
     else 
      truefalse = false; 
    } 

    // Either/both are not objects 
    else 
     truefalse = (obj1 === obj2); 

    return truefalse; 
} 

console.log(deepEqual({here: 3, object: 1}, {object: 1, here: 2})) 
// → true 

私の質問

、私が最初に私のhereプロパティの値(3、2)を比較するとき、それはfalseを返すことを疑います彼らはお互いに異なるので私のtruefalse変数に。しかし、for(var event in obj1) {...}ループがobjectプロパティに移動すると、truefalse変数は同じ値を持つため、trueと書き直されます。

これが正しい診断であれば、とにかくこのエラーを修正するにはどうすればよいですか?おそらく私はorという条件を使うべきですが、私はそれをforループと組み合わせる方法を考えることはできません。

この初心者にお寄せいただきありがとうございます。

PS。この記事を書いているうちに、inテストを使って、両方のオブジェクトのすべてのプロパティに同じ名前が付いているかどうかを調べることができたことに気付きましたが、今はあまりにも疲れて投稿を編集できません。私のコードのその部分が不器用に見える場合はお詫び申し上げます。

+0

あなたの問題はあなたの '(OBJ1内のvarイベント)のための' forループの各反復であなたの 'truefalse'変数の値を上書きしていることです。 – zoom

答えて

1

一般に、関数は真(等号)を返し、差異が見つかった場合は直ちにfalseを返すようにする必要があります。

また、デフォルト値のtruefalseを変更してください。

var truefalse = true 

続いて、今では

for(var event in obj1) 
{ 
    if(deepEqual(obj1[event], obj2[event]) == false) 
     return false 
}; 

動作するはずで

for(var event in obj1) 
{ 
    if(deepEqual(obj1[event], obj2[event])) 
     truefalse = true 
    else 
     truefalse = false; 
}; 

を交換してください!

Rgrds、

+0

それは初心者として私には本当に非常に照らしていた。最初は私には同じことが起こるのではないかと心配しました。真のマッチが偽の結果を逆転させ、私は偽の「真の」結果に終わるでしょう。しかし、私は今、その場合、最初に「if」節に入ることさえなく、誤ったリターンが残っていることを認識しています。再度、感謝します! – seismatica

関連する問題