在Javascript中迭代对象

3

我有一个这样的对象:

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)?


2
我这里没有看到JSON,它是一种基于文本的数据交换格式。请使用“对象”一词而不是“[关联]数组”,以避免危险的混淆。 - Lightness Races in Orbit
请使用console.log或实际的调试器,而不是document.write。此外,请为了神的缘故,有人写一个答案,不要鼓励在数组中使用for-in循环。 - hugomg
数组在哪里?我没有看到。 - Anurag
我知道这样做在技术上是正确的,但如果我再看到一个类似“那不是JSON,那是一个对象”之类的评论,我可能就得把刀子插进某个东西里。 - danimal
4个回答

2
据我所知,var y in years会给你数组years。使用years[y]可以获取实际的值。

2
您最终将使用y作为访问年份元素的索引,即0和1(因为年份是一个数组)。因此,要访问年份的值,请尝试使用以下方法:
writeln(years[y])

替代

writeln(y)

(在我看来,Javascript的工作方式有些反直觉。)

2

for in 循环获取的是索引/键(而不是值)。

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

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

编辑 - 根据missingno的评论,使用for in迭代数组是一个不好的主意

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);
}

有没有一种方法可以像在Python中通过for循环迭代器访问元素一样,只是通过引用数组来访问元素? - DrewConway
@DrewConway,你要找的是for each,用于迭代对象属性值,但它是非标准的且不常用。如果你想迭代数组,请查看forEach - Anurag
我个人推荐underscore.js作为函数桥梁,例如forEach这样的函数目前还没有得到广泛支持。 - John Strickler

2
在 JavaScript 中,for in 循环并不是你想象的那样,它会返回对象属性的键而不是元素本身。
你可能需要使用:for of 循环。
for(var y in years) {
  document.writeln(years[y]);
}

由于你得到了0,1,看起来years是一个实际的数组,所以你也可以简单地执行以下操作

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

另外,您已经编辑了标题,但是需要注意术语。如果它是字符串,则为JSON格式。如果它是对象,则它就是一个对象。不存在所谓的“json对象”或“json数组”。


谢谢您的清晰说明。我在JavaScript以外的主要与JSON交互方面缺乏知识。 - DrewConway
@Drew - 别担心。我以前也总是叫它json对象,直到有人在SO上纠正了我 :) - Adam Rackis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接