2016-09-18 2 views
1

Я не могу получить мой цикл for for, чтобы продолжить работу после первого свойства в моем объекте. Это вопрос из красноречивых JavaScript в главе 4:Для цикла в рекурсивной функции, не завершающейся

Написать функцию, deepEqual, которая принимает два значения и возвращает истину только если они имеют одинаковое значение или объекты с одинаковыми свойствами, значения которых также равным по сравнению с рекурсивным вызовом для deepEqual.

Чтобы узнать, нужно ли сравнивать две вещи по идентичности (используйте для этого оператор === ) или, посмотрев на их свойства, вы можете использовать оператор типа . Если он создает «объект» для обоих значений, вы должны выполнить глубокое сравнение. Но вы должны принять одно глупое исключение в учетную запись : по исторической аварии typeof null также производит «объект».

Вот мой код:

function deepEqual(obj1, obj2) { 
    if ((typeof obj1 === 'object' && obj1 != null) && (typeof obj2 === 'object' && obj2 != null)) { 
    for (var property in obj1) { 
     if (property in obj2) { 
     return deepEqual(obj1[property], obj2[property]) 
     } else { 
     return false; 
     } 
    } 
    } else if (obj1 !== obj2) { 
    return false; 
    } else { 
    return true; 
    } 
} 

var obj = {object: 3, here: 1}; 
var obj2 = {object: 3, here: 2}; 

console.log(deepEqual(obj, obj2)); 

Консоль возвращает истину, когда он должен сказать ложь, потому что «здесь» свойства не равны. При просмотре вывода это происходит потому, что «for in loop» в функции завершается после первого свойства. Пожалуйста, помогите мне, почему это не продолжается.

ответ

0

ваш цикл не может выйти за пределы первого свойства, потому что вы вернетесь из функции при вызове deepEqual

for (var property in obj1) { 
     if (property in obj2) { 
     // returning means no more looping.... 
     return deepEqual(obj1[property], obj2[property]) 
     } 

вы хотите продолжить цикл если таковые deepEqual возвращается, что его равным, или вернуть его ложный.

+0

Спасибо за комментарий! Ваш ответ имеет смысл, и я получил его для работы, заменив return: 'if (! DeepEqual (obj1 [property], obj2 [property])) return false;'. – runandrew

Смежные вопросы