Javascript如何从数据对象中删除原型方法或使对象使用Qunit equals

Javascript如何从数据对象中删除原型方法或使对象使用Qunit equals,javascript,jquery,qunit,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,

我已经开始与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 ?");
这个测试失败了,我可以看到,虽然expected只包含id和name字段,但result还包含大量函数,例如

"function (iterator, context) {...
我认为这些函数来自于我将对象当作数组来分配给它

有没有办法去掉这些函数(或者从一开始就防止它们被添加)

我在考虑做什么

result = $.parseJSON($.toJSON(result));

有更好的方法吗?

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

if(typeof fields[field] == 'function') continue;
另外,不要在数组上的中为..使用

for(var i = 0; i < fields.length; i++) {
   result[result[i]] = result[i];
}
for(变量i=0;i
严格来说,这里的对象不是一个对象,而是一个
数组
对象,尽管如此,它仍然是一个对象,但并不是说它有键值对


如果您使用普通的
for
循环,您将不会像使用
for..in
那样迭代原型链,因此这样做可能会解决您的问题。

问题在于您使用
for..in
,它迭代
字段继承自
对象的所有内容。如果必须在
中为…保留
,则可以这样修改它:

for (var field in fields){
  if( fields.hasOwnProperty( field ) ){
    var name = fields[field];
    result[name] = name;
  }
}

hasOwnProperty
如果对象(且数组是对象)的指定属性未继承,则返回true。

不应在数组中使用
。的第6章提供了一个很好的解释:

因为JavaScript的数组实际上是 对象,则可以在
语句中使用 用于迭代所有 数组的属性。不幸的是,
for in
不保证 属性的顺序,以及 数组应用程序需要元素 按数字顺序生产。 此外,还有一个问题 正在挖掘意外的属性 来自原型链。


对于
循环,请使用传统的C样式

如果可能的话,我不想重写qunit的equals函数。然后,唯一的另一种使用方法是迭代,如果它是一个函数,则删除结果[name],但我认为会有一种更干净的方法。总是有
hasOwnProperty()
(我并不宽恕它的使用):)我忘了提到我使用的是jquery和原型库,不确定这些是否是附加对象属性的原因。这与jQuery或Prototype无关。JavaScript的本机
for in
构造将挖掘每个对象属性,包括继承的属性。对于阵列,如果仅在阵列元素之后,请始终使用常规的
For
循环。