2015-03-26 8 views
0

Я написал функцию, которая сравнивает два объекта, равные ли они. Почему моя инструкция return в цикле не работает?Функция возврата не работает

var deepEqual = function(a, b){ 
 
\t \t var aProp = Object.getOwnPropertyNames(a); 
 
\t \t var bProp = Object.getOwnPropertyNames(b); 
 
\t \t if(aProp.length !== bProp.length){ 
 
\t \t \t return false; 
 
\t \t } 
 
\t \t else{ 
 
\t \t \t for (var i = 0; i < aProp.length; i++) { 
 
\t \t \t \t if(typeof a[aProp[i]] === 'object' && typeof b[bProp[i]] === 'object'){ 
 
\t \t \t \t \t deepEqual(a[aProp[i]], b[bProp[i]]); 
 
\t \t \t \t } 
 
\t \t \t \t else{ 
 
\t \t \t \t \t if(a[aProp[i]] !== b[bProp[i]]){ 
 
\t \t \t \t \t \t return false; // WHY IT DOESN'T WORK??? 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t }; 
 
\t \t \t return true; 
 
\t \t } 
 
\t }; 
 

 
\t var obj = {a: 2, here: {is: "asn"}, object: 2, d: 12}; 
 
\t console.log(deepEqual(obj, {a: 2, here: {is: "an"}, object: 2, d: 12}));

ответ

4

Вы ничего не делаете с рекурсивным вызовом deepEqual.

Вы можете проверить свой результат, и вернуться ложным, если нет матча:

var deepEqual = function(a, b){ 
 
    var aProp = Object.getOwnPropertyNames(a); 
 
    var bProp = Object.getOwnPropertyNames(b); 
 
    if(aProp.length !== bProp.length){ 
 
    return false; 
 
    } 
 
    else { 
 
    for (var i = 0; i < aProp.length; i++) { 
 
     if(typeof a[aProp[i]] === 'object' && typeof b[bProp[i]] === 'object'){ 
 
     if(!deepEqual(a[aProp[i]], b[bProp[i]])) { //<- changed 
 
      return false; 
 
     } 
 
     } 
 
     else { 
 
     if(a[aProp[i]] !== b[bProp[i]]){ 
 
      return false; 
 
     } 
 
     } 
 
    } 
 
    return true; 
 
    } 
 
}; 
 

 
var obj = {a: 2, here: {is: "asn"}, object: 2, d: 12}; 
 
console.log(deepEqual(obj, {a: 2, here: {is: "an"}, object: 2, d: 12})); //false

+1

О, большое спасибо !!!! – StasKh

3

Вы используете рекурсию, но не проверять, если рекурсивный вызов не удалось. Попробуйте это вместо этого:

if (!deepEqual(a[aProp[i]], b[bProp[i]])) { 
     return false; 
    }