在Javascript中迭代对象

时间:2011-12-05 17:16:33

标签: javascript arrays d3.js

我对形式有所了解:

var test = {"2011":{"10":4,"9":9,"8":15,"7":11,"6":11,"5":13,"4":9,"3":5,"2":9,"1":4,"0":20},"2010":{"11":9,"10":23,"9":58}}

我想迭代这个,所以我可以点击每年和每月组合。我有:

var years = d3.keys(test),
    months = d3.range(12),
    data = [];

所以,作为一个Javascript新手,为了理智检查我检查的内容years

document.writeln(years)
2011,2010 

很酷,但是当我尝试遍历years数组以从test中提取数据时,我认为这些元素是正确的测试,但元素丢失了:

for(var y in years) {
  document.writeln(y);
}
0,1

如何迭代years以获取其中的实际元素(2011,2010)?

4 个答案:

答案 0 :(得分:2)

for in检索索引/键(不是值)。

您需要修改循环,如下所示:

for(var y in years) {
  document.writeln(years[y]);
}

编辑 - 根据missingno的评论,使用for in迭代数组是bad idea

for(var i = 0, l = years.length; i < l; i++) {
  document.writeln(years[i]);
}

一些额外的信息......如果你对一个对象使用for / in循环,它也会迭代你的属性键。例如,

for(var y in test) {
  //This will yield, "2011" and then "2010"
  document.writeln(y);
}

答案 1 :(得分:2)

在javascript for in循环中,不要按照您的想法执行操作;他们给你钥匙,而不是元素

你想要

for(var y in years) {
  document.writeln(years[y]);
}

因为你回来了0,1看起来几年是一个实际的数组,所以你也可以简单地做

for(var i = 0; i < years.length; i++) {
    document.writeln(years[i]);
}

此外,您已经编辑了标题,但是有关术语的说明。如果它是一个字符串,那么它是JSON。如果它是一个对象,那么,它就是一个对象。没有“json对象”或“json数组”

这样的东西

答案 2 :(得分:2)

AFAIK,var y in years会向数组years提供years[y]应该为您提供实际价值。

答案 3 :(得分:2)

y将最终成为您访问元素的索引,年份为0和1(因为年份是数组)。因此,要访问年份值,请尝试使用

writeln(years[y])

而不是

writeln(y)

(恕我直言,通过这种方式Javascript有点反直觉)