2016-06-13 30 views
-2

我试图解决以下问题:雄辩的Javascript(4.4深层次比较)

写一个函数,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

您会得到真实的结果,因为您在比较对象中的第一个键后立即返回值。

难道你代码中的小变化:

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; 
 
    } 
 
    } 
 
}