2016-07-15 2 views
2

Je vérifiait cette question Javascript Deep Comparison La solution du demandeur question ne m'a pas convaincu j'ai donc essayé d'analyser le problème et est venu avec cetteJavascript: Comparaison profonde

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 } 

Ce code ne passe pas le dernier test (console.log (deepEqual (obj, {ici: 2})))) mais la logique de considérer des objets profondément égaux s'ils ont respectivement des clés et des valeurs égales bien qu'ils soient des instances différentes en mémoire ne me convainc pas. Y a-t-il un problème avec ma «solution» ou l'erreur réside-t-elle dans les présomptions de l'exercice? Le code mentionné dans la question que j'ai liée est-il valide?

ressources qui hikinthru oublié de mentionner (http://eloquentjavascript.net/04_data.html#exercise_deep_compare)

+0

On ne sait pas ce que vous demandez. Êtes-vous en train de dire que vous n'êtes pas d'accord avec ce que l'égalité profonde devrait signifier? –

+0

Cela fait partie de ce que je demande. Ma solution préconisée est-elle incorrecte ou y a-t-il un problème avec la question? La dernière ligne montre que pour les navigateurs, même les objets avec les mêmes clés et leurs valeurs respectives ne sont pas strictement égaux. S'il vous plaît, s'il y a un problème avec la question, faites-le moi savoir et je le supprimerai. – zenwaichi

+0

Eh bien votre fonction ne fait jamais 'return true' après avoir établi que les deux objets ont les mêmes propriétés ... – Bergi

Répondre

4

« l'égalité profonde », ce qui est la question que vous avez lié à parle, et « stricte égalité » sont deux choses différentes. "L'égalité profonde" signifie, comme vous l'avez dit, "des clés égales et des valeurs égales". "L'égalité stricte" pour les objets signifie "même instance". L'égalité stricte implique une égalité profonde, mais les objets peuvent être profondément égaux sans être strictement égaux.

Votre code est quelque peu inefficace, car vous avez seulement besoin d'une boucle, mais il se comportera correctement si vous vérifiez a === b dans un bloc else et return true après les for boucles. En effet, vous devez gérer les objets séparément des valeurs primitives telles que les chaînes et les nombres. J'ai enlevé un enregistrement pour des raisons de clarté, et j'ai essayé de garder votre style.

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

Peut être avec un indicateur de profondeur maximum, ce serait mieux. Merci. – myuce