2016-07-15 5 views
2

Я проверял этот вопрос Javascript Deep Comparison Решение вопроса Аскер не убедит меня, так что я попытался проанализировать проблему и придумал, чтоJavascript: Deep Сравнение

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 } 

Этот код не последнее испытание (console.log (deepEqual (obj, {here: 2}))), но логика рассмотрения объектов, глубоко равных, если они имеют равные ключи и значения, несмотря на то, что они разные экземпляры в памяти, не убеждает меня. Есть ли проблема с моим «решением» или ошибка заключается в презумпции упражнения? Является ли код, упомянутый в вопросе, который я связывал, действительным?

Ресурсы, которые hikinthru забыл упомянуть (http://eloquentjavascript.net/04_data.html#exercise_deep_compare)

+0

Неясно, что вы просите. Вы говорите, что не согласны с тем, что должно означать глубокое равенство? –

+0

Это часть того, что я прошу. Является ли мое защищенное решение неправильным или есть проблема с вопросом? Последняя строка показывает, что для браузеров даже объекты с одинаковыми клавишами и их значения не являются строго равными. Если у вас возникнут проблемы с вопросом, дайте мне знать, и я удалю его. – zenwaichi

+0

Ну, ваша функция никогда не возвращает true, установив, что оба объекта имеют одинаковые свойства ... – Bergi

ответ

4

«Глубокое равенство», которое является то, что вопрос, который вы связаны, о чем говорит, и «строгое равенство» это две разные вещи. «Глубокое равенство» означает, как вы сказали, «равные ключи и равные ценности». «Строгое равенство» для объектов означает «тот же экземпляр». Строгое равенство подразумевает глубокое равенство, но объекты могут быть глубоко равными, не будучи строго равными.

Ваш код несколько неэффективен, поскольку требуется только один цикл, но он будет вести себя правильно, если вы проверяете a === b в качестве else блока и return true после for петель. Это связано с тем, что вы должны обрабатывать объекты отдельно от примитивных значений, таких как строки и числа. Я удалил некоторые записи для ясности, и я попытался сохранить ваш стиль.

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