Javascript如何从数据对象中删除原型方法或使对象与Qunit等号一起工作

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)

有没有更好的办法?

Jac*_*kin 5

您可以检查集合中每个对象的类型,以查看它是否是一个函数:

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,因此这样做可能会解决您的问题。

  • 总有一个“ hasOwnProperty()”(不是我同意使用):) (2认同)

Ken*_*ler 5

问题是你的使用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 .