Chr*_*s J 8 javascript jquery qunit
我已经开始与Qunit合作对我的代码进行单元测试,但是在比较对象时遇到了惊人的问题.
我正在测试的代码动态创建一个对象:
var fields = ['id','name'];
var result = {};
for (var field in fields)
{
var name = fields[field];
result[name] = name;
}
var expected = { id : 'id', name : 'name' };
test(expected, result, "same ?");
Run Code Online (Sandbox Code Playgroud)
这个测试失败了,我可以看到虽然预期只包含字段id和name,但结果还包含很多函数,例如
"function (iterator, context) {...
Run Code Online (Sandbox Code Playgroud)
我认为这些函数来自于我将对象视为数组以便分配给它.
有没有办法剥离这些功能(或防止它们首先被添加)?
我在考虑做
result = $.parseJSON($.toJSON(result));
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
您可以检查集合中每个对象的类型,以查看它是否是一个函数:
if(typeof fields[field] == 'function') continue;
Run Code Online (Sandbox Code Playgroud)
另外,不要for..in在数组上使用:
for(var i = 0; i < fields.length; i++) {
result[result[i]] = result[i];
}
Run Code Online (Sandbox Code Playgroud)
严格来说,您所拥有的并不是一个对象,而是一个Array对象,尽管它是一个对象,但是从某种意义上说,它具有键值对。
如果您使用香草for循环,则不会像使用那样遍历原型链for..in,因此这样做可能会解决您的问题。
问题是你的使用for...in,这是迭代所有fields继承自object.如果你必须保留for...in,你可以像这样修改它:
for (var field in fields){
if( fields.hasOwnProperty( field ) ){
var name = fields[field];
result[name] = name;
}
}
Run Code Online (Sandbox Code Playgroud)
hasOwnProperty如果未继承对象的指定属性(并且数组是对象),则返回true .