私は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
テストを使って、両方のオブジェクトのすべてのプロパティに同じ名前が付いているかどうかを調べることができたことに気付きましたが、今はあまりにも疲れて投稿を編集できません。私のコードのその部分が不器用に見える場合はお詫び申し上げます。
あなたの問題はあなたの '(OBJ1内のvarイベント)のための' forループの各反復であなたの 'truefalse'変数の値を上書きしていることです。 – zoom