2016-07-15 4 views
2

私は質問アスカーの解決策は、私は問題を分析しようとしたそのJavascriptを:ディープ比較

var obj = {here: 2}; 
console.log(deepEqual(obj, obj)); 
// → true 
console.log(deepEqual(obj, {here: 1})); 
// → false 
console.log(deepEqual(obj, {here: 2})); 
// → true 
function deepEqual(a,b) 
{ 
    if((typeof a == 'object' && a != null) && 
     (typeof b == 'object' && b != null)) 
    { 
    var count = [0,0]; 
    for(var key in a) count[0]++; 
    for(var key in b) count[1]++; 
    if(count[0]-count[1] != 0) {console.log('1');return false;} 
    for(var key in a) 
    { 
     if(!(key in b) || !deepEqual(a[key],b[key])) {console.log('2');return false;} 
    } 
    for(var key in b) 
    { 
     if(!(key in a) || !deepEqual(b[key],a[key])) {console.log('3');return false;} 
    } 
    } 
    console.log('a:'+a+' b:'+b); 
    return a===b; 
} 
obj === { here:2 } 

を思い付いたこのコードは、最後のテストを(失敗した私を説得していないこの質問にJavascript Deep Comparison をチェックしていましたconsole.log(deepEqual(obj、{here:2}))))しかし、メモリ内のインスタンスが違うにもかかわらず、等しいキーと値を持っていれば、オブジェクトを深く等しくするロジックは、私を納得させるものではありません。私の「解決策」に問題があるのでしょうか、またはミスが運動の前提にありますか?私がリンクした質問に記載されているコードは有効ですか? hikinthruが言及するのを忘れてしまった

資源(http://eloquentjavascript.net/04_data.html#exercise_deep_compare

+0

それはあなたが求めているものは不明です。あなたは深い平等が意味するべきことにあなたが反対していると言っていますか? –

+0

それは私が求めていることの一部です。私の主張している解決法が間違っているのですか、それとも問題がありますか?最後の行は、ブラウザでは、同じキーとそのそれぞれの値を持つオブジェクトさえ厳密には等しくないことを示しています。質問に問題がある場合はお知らせください。削除します。 – zenwaichi

+0

さて、あなたの関数は、両方のオブジェクトが同じプロパティを持っていることを確かめた後、決して 'return true'を返しません... – Bergi

答えて

4

あなたがにリンクされ、質問が話しているものである「ディープ平等」、および「厳密な等価」は、2つの異なるものです。 「深い平等」とは、あなたが言ったように、「等しい鍵と等しい価値」を意味します。オブジェクトの「厳密な平等」は「同じインスタンス」を意味します。厳密な平等は深い平等を意味しますが、オブジェクトは厳密に等しくなくても深く等しくなることがあります。

一つだけのループを必要としていますが、forループ後elseブロックでa === breturn trueをチェックすると、それが正常に動作しますので、あなたのコードはやや非効率的です。これは、文字列や数値などのプリミティブ値とは別にオブジェクトを扱う必要があるためです。わかりやすくするためにいくつかのログを取り除きました。あなたのスタイルを維持しようとしました。

var obj = {here: 2}; 
 
console.log(deepEqual(obj, obj)); 
 
// → true 
 
console.log(deepEqual(obj, {here: 1})); 
 
// → false 
 
console.log(deepEqual(obj, {here: 2})); 
 
// → true 
 
console.log(obj === { here:2 }); 
 
// → false 
 
function deepEqual(a,b) 
 
{ 
 
    if((typeof a == 'object' && a != null) && 
 
     (typeof b == 'object' && b != null)) 
 
    { 
 
    var count = [0,0]; 
 
    for(var key in a) count[0]++; 
 
    for(var key in b) count[1]++; 
 
    if(count[0]-count[1] != 0) {return false;} 
 
    for(var key in a) 
 
    { 
 
     if(!(key in b) || !deepEqual(a[key],b[key])) {return false;} 
 
    } 
 
    for(var key in b) 
 
    { 
 
     if(!(key in a) || !deepEqual(b[key],a[key])) {return false;} 
 
    } 
 
    return true; 
 
    } 
 
    else 
 
    { 
 
    return a === b; 
 
    } 
 
}

+0

最大深度インジケータがあるかもしれません。ありがとう。 – myuce