深度比较(Eloquent Javascript第4章):代码在测试用例中失败
Deep Comparison (Eloquent Javascript Chapter 4): code fails a test case
我正在学习Eloquent Javascript书中的Javascript。我有点困惑于我的代码是如何在第4章(对象介绍)中的深度比较练习中失败的
目标
编写一个函数deepEqual,它接受两个值并返回true仅当它们具有相同值或是具有相同值的对象时与递归相比,其值也相等的属性调用deepEqual。
要确定是否按身份比较两件事(使用===运算符),或者通过查看它们的属性,可以使用运算符类型。如果它为两个值都生成"对象",则应该做一个深入的比较。
我的代码
function deepEqual(obj1, obj2)
{
var truefalse = undefined;
var type1 = typeof obj1;
var type2 = typeof obj2;
// In case both are objects
if(type1 == 'object' && type2 == 'object')
{
var prop1 = [];
var prop2 = [];
for(var prop in obj1)
prop1.push(prop);
for(var prop in obj2)
prop2.push(prop);
// Test if both objects have the same number of properties
if(prop1.length == prop2.length)
{
// Test if all properties between them have the same names,
// by generating index for each property in prop1 against prop2
var indexArray = [];
for(var i = 0; i < prop1.length; i++)
{
var index = prop2.indexOf(prop1[i]);
indexArray.push(index);
};
// If there's no "-1" anywhere in the indices generated
// (all properties are named the same between them),
// move on to value comparison for each property
if(indexArray.indexOf(-1) == -1)
{
for(var event in obj1)
{
if(deepEqual(obj1[event], obj2[event]))
truefalse = true
else
truefalse = false;
};
}
// Different property names
else
truefalse = false;
}
// Different number of properties
else
truefalse = false;
}
// Either/both are not objects
else
truefalse = (obj1 === obj2);
return truefalse;
}
console.log(deepEqual({here: 3, object: 1}, {object: 1, here: 2}))
// → true
我的问题
通过一些调试,我怀疑当首先比较here
属性的值(3和2)时,它会向truefalse
变量返回false,因为它们彼此不同。但是,当for(var event in obj1) {...}
循环转到object
属性时,我的truefalse
变量被重写为true,因为两者具有相同的值。
如果这是正确的诊断,是否有任何方法可以纠正此错误?也许我应该使用or
条件,但我就是想不出将它和for循环结合起来的方法。
谢谢你对这个初学者的帮助。
PS。在写这篇文章的时候,我意识到我本可以使用in
测试来检查两个对象中的所有属性是否命名相同,但我现在太累了,无法编辑这篇文章。如果我的代码的那部分看起来很笨拙,我深表歉意。
通常,您应该假设函数返回true(equals),当发现任何差异时,立即返回false。
首先,更改truefalse的默认值。
var truefalse = true
然后,更换
for(var event in obj1)
{
if(deepEqual(obj1[event], obj2[event]))
truefalse = true
else
truefalse = false;
};
带有
for(var event in obj1)
{
if(deepEqual(obj1[event], obj2[event]) == false)
return false
};
现在它应该工作了!
Rgrds,
相关文章:
- 你好,这是测试用例,我必须在函数中传递n个参数
- 如何为以下角度函数编写单元测试用例
- 是否有任何开源web应用程序具有良好的QUnit(或JSUnit)测试用例
- 因果报应并没有执行测试用例
- 运行茉莉花测试用例
- 如何阻止量角器在失败时运行进一步的测试用例
- 从FORM访问HTML元素的JavaScript函数的单元测试用例
- Regex单词边界(退格)测试用例
- 针对每个场景使用Jasmine测试用例
- JavaScript/jQuery-脚本不起作用-添加&删除类,合并数组-测试用例
- 你如何为 HTML 输出编写测试用例
- 如何在 eclipse 中为 angularjs 测试和创建测试用例
- Casperjs 多个测试用例
- 不同功能的摩卡测试用例
- 量角器在不使用browser.sleep的情况下编写更干净的测试用例
- 为什么jquery正则表达式每次返回不同的测试用例
- 如何在摩卡的测试用例中调用另一个测试用例
- 函数内 Restangular 的茉莉花测试用例
- 如何创建JavaScript测试用例
- 请建议如何为以下angularjs代码编写Jasmine测试用例