2011-11-24 71 views
0

我有一些javascript如下图所示的JavaScript循环返回键“的indexOf”

for (var titleKey in data.d) { 
    var title = data.d[titleKey]; 
} 

这实际上是从未来一个jQuery回调至.NET Web服务上,但我不相信这是相关的。

我的循环正确迭代集合中的每个元素,然后再一次继续遍历循环。 titleKey在这里是'indexof',标题是'undefined'。

这是发生在我的代码中的两个不同的地方。

这是什么造成的?我怎样才能防止它?

在此先感谢。

+0

“这是什么造成的?”究竟是什么造成了什么?你实际上没有解释问题是什么。 – spender

+1

你可以'console.log(data.d)'并在问题中包含输出吗?了解它包含的内容会很有帮助。 – davidchambers

+0

data.d的控制台给出: [0]: “MR” [1]: “夫人” [2]: “小姐” [3]: “MS” [4]: “DR” [5]:“Rev” titleKey从0-5开始,然后是'indexof' – Liath

回答

5

您需要从循环中排除原型的属性。 for ... in结构将遍历它在原型链中找到的所有内容,而不仅仅是子对象的属性。

for (var titleKey in data.d) { 
    if (data.d.hasOwnProperty(titleKey)) { 
    // own property // 
    } 
    else { 
    // inherited property // 
    } 
} 

从什么控制台日志中说,我怀疑的是,你有在其原型阵列实现了indexof库。

我的建议是使用correct way走阵:

for (var index = 0; index < data.d.length; index++) {...} 

for in是对象,而不是数组。 这是一个常见的初学者错误,其中滥用了Array是从Object派生的事实。从davidchambers

+1

“它在原型链中找到的所有东西”都不完全正确。 “原型链中的可枚举属性”更准确。 – davidchambers

+0

@davidchambers是的,我知道,但我不想为他增加更多的困惑。他应该一次采取一步:) –

+0

我最初将原因归因于阵列行走方法。但是,该数组没有(**小写**)'indexof'属性,其值不是'未定义的。 –

0

根据手头的资料,我会说data.d.indexof其实undefined。下面是一个完全有效的数据结构:

foo: 42 
bar: [1, 2, 3] 
baz: false 
indexof: undefined 

作为一个全面的检查,请尝试以下操作:

console.log(Object.prototype.hasOwnProperty.call(data.d, 'indexof')) 

编辑:现在,它已经很清楚,数据结构实际上是一个数组,这个答案不能解决OP的问题。但它仍然有效,所以我不会删除它。

2

Javascript的“for-in”遍历一个对象的所有属性,这包括方法名称。

1

如果indexof来自原型链,则必须使用hasOwnProperty来跳过它。

for (var titleKey in data.d) { 

    if (data.d.hasOwnProperty(titleKey)) 
    { 
     var title = data.d[titleKey]; 
    } 

} 
2

使用下面的循环机制

*见注释:

for (var i = 0; i < titleKey.length; i++) { 
    var title = data.d[titleKey[i]]; 
} 

的为:在循环遍历一个对象的所有属性,而不仅仅是那些是可转位。