-1

可以肯定,这是一个奇怪的现象。首先,我使用的是 Chrome 版本 23.x,还没有尝试在其他浏览器中重现此功能。

我从表单的服务器收到一个 JSON 数组:

JSON

{
"layout":0,
"caption":"Work History",
"cols":[
   {"field":"company","label":"Company Name","hidden":false,"order":-1,"validationType":2,"list":[]},       {"field":"date_start","label":"From","hidden":false,"order":-1,"validationType":1,"list":[]},
   {"field":"date_end","label":"Until","hidden":false,"order":-1,"validationType":0,"list":[]},
   {"field":"position","label":"Title","hidden":false,"order":-1,"validationType":2,"list":[]},
   {"field":"description","label":"Description","hidden":false,"order":-1,"validationType":0,"list":[]},
   {"field":"project","label":"Project","hidden":false,"order":-1,"validationType":64,"list":[]}
   ]
}

然后,我尝试使用 Javascript 循环遍历 cols 对象"

Javascript

for (var c in json.cols) {
    console.log("col name: " + c);
}

谷歌浏览器的控制台打印以下内容:

输出

col name: 0
col name: 1
col name: 2
col name: 3
col name: 4
col name: 5
col name: remove

首先,应该只有 6 个输出。其次,这个最终的“删除”密钥从何而来?为什么要上市?

4

2 回答 2

3

obj.json.cols实际上是一个数组,而不是一个对象,因此您应该使用循环对其进行迭代for(;;)。我相信你正在寻找这样的东西:

for (var i=0; i<json.cols.length; i++) {
    console.log("col name: " + json.cols[i].label);
}

Array.prototype此外,您的网页上似乎有一些脚本弄乱了,就像for..in循环一样,您应该看到remove属性。

于 2013-01-10T18:24:59.853 回答
3

用于if( json.cols.hasOwnProperty(c) ) { ... }将代码包装在for...in循环中。

取自mdn

如果您只想考虑附加到对象本身的属性,而不是其原型,请使用getOwnPropertyNames或执行 hasOwnProperty检查(也可以使用propertyIsEnumerable )。

for...in 循环以任意顺序迭代对象的属性

JavaScript:

for (var c in json.cols) {
    if( json.cols.hasOwnProperty(c) ) {
      console.log("col name: " + c);
    }
}

例子

于 2013-01-10T18:25:07.590 回答