2016-06-13 2 views
-2

Я пытаюсь решить следующий вопрос:Eloquent Javascript (4,4 Deep Сравнение)

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

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

Мой код выглядит следующим образом:

var obj = {here: {is: "an"}, object: 2}; 
console.log(deepEqual(obj, {here: {is: "an"}, object: 55})); 

function deepEqual(obj1, obj2){ 
    if (obj1===obj2) {return true;} 
    else if(obj1===null || obj2=== null){return false;} 
    else{ 
    if(typeof(obj1)==="object" || typeof(obj2)==="object"){ 
     for (var key in obj1) { 
      //console.log(obj1[key]); 
      //console.log(obj2[key]); 
      //console.log("compares:"+obj1[key]+" with "+obj2[key]); 
      return JSON.stringify(obj1[key])===JSON.stringify(obj2[key]); 
     }; 
    } 
    } 
} 

я должен получать ложные (из-за отличающихся значений 2 и 55), но я получаю истинное. Любая идея почему? Благодарю.

+0

Ваше сравнение работает только для первой итерации, как вы 'return'ing немедленно. – Marty

+0

Что это хороший способ исправить? – user3477051

+0

Возможно, вы найдете несколько ответов [здесь] (https://github.com/substack/node-deep-equal). – Marty

ответ

1

Вы получаете значение true, потому что вы возвращаете значение сразу после сравнения первого ключа в объекте.

ли небольшое изменение в вас код:

var obj = { 
 
    here: { 
 
    is: "an" 
 
    }, 
 
    object: 2 
 
}; 
 
console.log("falsy test: " + deepEqual(obj, { 
 
    here: { 
 
    is: "an" 
 
    }, 
 
    object: 55 
 
})); 
 

 
console.log("truthy test: " + deepEqual(obj, { 
 
    here: { 
 
    is: "an" 
 
    }, 
 
    object: 2 
 
})); 
 

 
function deepEqual(obj1, obj2) { 
 
    var result = false; 
 
    if (obj1 === obj2) { 
 
    return true; 
 
    } else if (obj1 === null || obj2 === null) { 
 
    return false; 
 
    } else { 
 
    if (typeof(obj1) === "object" || typeof(obj2) === "object") { 
 
     for (var key in obj1) { 
 
     //console.log(obj1[key]); 
 
     //console.log(obj2[key]); 
 
     //console.log("compares:"+obj1[key]+" with "+obj2[key]); 
 
     if (JSON.stringify(obj1[key]) === JSON.stringify(obj2[key])) { 
 
      result = true; 
 
     } else { 
 
      return false; 
 
     } 
 

 
     }; 
 
     //return result after all the values in object are compared. 
 
     return result; 
 
    } 
 
    } 
 
}

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