Javascript:array.forEach()有时不起作用
这是我的代码片段,其中程序不进入foreach循环:Javascript:array.forEach()有时不起作用,javascript,protovis,Javascript,Protovis,这是我的代码片段,其中程序不进入foreach循环: var ct = new Array(); ct["me"]= {"name" : "Jakub"}; ct["you"]= {"name" : "stack"}; ct.forEach(function (c){ document.getElementById("tmp").appendChild(document.createTextNode(c)); }); 当我将数组索引从字符串(“我”、“你”)更改为整数时,它可以工作: v
var ct = new Array();
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};
ct.forEach(function (c){
document.getElementById("tmp").appendChild(document.createTextNode(c));
});
当我将数组索引从字符串(“我”、“你”)更改为整数时,它可以工作:
var ct = new Array();
ct[0]= {"name" : "Jakub"};
ct[1]= {"name" : "stack"};
ct.forEach(function (c){
document.getElementById("tmp").appendChild(document.createTextNode(c));
});
你能帮我实现用各种索引遍历数组的解决方案吗?我的目标是存储给定日期对象的值
我使用库中的数据,而且它需要一个数组作为输入 我在protovis示例中使用的数据结构比上面显示的更复杂 在我的项目中,我通过JavaBean发送一些对象集。这些对象包含日期等内容。我的目标是在protovis网站http://vis.stanford.edu/protovis/ex/area.html上显示这些对象 我将使用水平轴表示时间,垂直轴表示给定时间内的对象数。这就是为什么我想让数组按日期排序,因为AFAIK protovis只允许数组在默认模式下作为图表的数据输入-函数链接 编辑: 现在我改变了方法。我没有将字符串存储为数组键,而是执行以下操作: 下面是我的原始代码片段:
edit2:我添加了一些原始输入: var result2={“h”:{ 10“文件”:[ 11 { 12“传记类”:[ 13 ], 14“机构”:“希腊保守党政府已下令调查1955年中情局与希腊军方达成的一项协议,该协议旨在建立一个游击队网络,以便在发生战争时打击入侵的华约部队。”, 15“描述符”:[ 16 ], 17“一般线性描述符”:[ 18 ], 19“guid”:0, 20“标题”:“希腊将调查游击战争计划”, 21“地点”:[ 22“希腊” 23 ], 24“姓名”:[ 25 ], 26“在线描述符”:[ 27 ], 28“onlineLocations”:[ 29 ], 30个“在线组织”:[ 31 ], 32“在线人士”:[ 33 ], 34“onlineTitles”:[ 35 ], 36“组织”:[ 37 ], 38“人”:[ 39 ], 40“发布日期”:“1990-11-21 00:00:00.0 CET”, 41“源文件”:“0402635.xml”, 42“分类分类器”:[ 43 ], 44“头衔”:[ 45 ], 46“材料类型”:[ 47 ], 48“分数”:0.80242133 49} edit3以上代码现在正在运行: 简而言之:我使用tlk数组将日期反映到索引中。对于resultTmp数组中的一个索引,我存储日期以及与该日期相关的对象集。 我使用的下一部分代码将日期从最早的日期排序到最新的日期,并对resultTemp进行类似的排序 我以以下方式以protovis呈现数据:
vis.add(pv.Line)
.data(result)
.lineWidth(2)
.left(function(a) x(a.date))
.bottom(function(a) y(a.docs.length))
.add(pv.Dot)
.lineWidth(function(a) a.docs.length - (a.docs.length-1)/3)
.radius(function(a) a.docs.length * (a.docs.length/1.2))
.fillStyle(function(a) color(a.docs.length))
.event("click", function(a) Popup.show(a.docs))
.anchor("top").add(pv.Label)
.text(function(a) a.docs.length)
.textBaseline("bottom");
vis.render();
示例性结果如下所示:
i、 imgur.com/WODYA.png我没有包括打印x轴和y轴以及从日期到图形宽度缩放的代码。你可以在protovis示例页面上找到示例 顺便说一句: 我不明白为什么在这一部分:
for(key in tlk){
dates[i] = new Date(key);
i++;
}
作为我得到的最后一个“包含”键,我试图在互联网上找到答案,但没有成功。
熊在他的评论中解释了我得到这个问题的原因是因为我正在迭代数组的属性。
JavaScript没有关联数组,PARSE。将只在索引属性上迭代。此处,
for…in
循环将对您有所帮助,但通常您会避免在数组上使用for…in
,因为它也会在命名属性上迭代
for (var c in ct) {
if (ct.hasOwnProperty(c)) {
// do something
}
}
另见:
JavaScript没有关联数组,PARSE。对象具有命名属性,但类似。前文()只会对索引属性进行迭代。Road中的<代码>将对您有所帮助,尽管在数组的中,也会避免使用<代码>,因为它也对命名属性进行迭代。
for (var c in ct) {
if (ct.hasOwnProperty(c)) {
// do something
}
}
另见:
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};
您正在向数组中添加特殊属性me
和you
;您没有向数组中添加元素。(另外,使用新数组()
构造函数有点奇怪。如果您想要数组,请使用[]
文本。)
听起来您应该使用JavaScript对象,而不是数组,但请注意它们只支持字符串索引
var ct = {};
ct['me'] = {name: 'Jakub'};
ct['you'] = {name: 'stack'};
for (var k in ct) {
document.getElementById('tmp', appendChild(document.createTextNode(ct[k]));
}
编辑:如果你想将水平轴视为时间,你真的不需要做更多的工作。有一个很好的基本示例:查看页面源代码以查看代码。这里的诀窍是,数据实际上是一个数组(对象的数组),x坐标显式表示为属性,而不是数据数组中的索引。数组中的每个元素如下所示:
>>> data[0]
{x: /* some JavaScript date object */, y: /* some number */ }
资料来源:
编辑2:您似乎仍然混淆了数组和对象 关于您的“BTW”:当您为(输入tlk)编写
…
您正在迭代数组中已经存在的键。这将数组视为对象,而这不是您想要的!您看到包含,因为您正在迭代数组的属性,包含是附加到每个数组的函数(您使用的是prototype还是其他类似的库?)
然而,基本的问题是,您正在索引到一个数组(tlk
)使用日期。这是一个很大的禁忌;即使tlk
是一个对象,因为你只能使用字符串对对象进行索引。我真的不明白你用tlk
做什么,但我认为你根本不需要它。你的输入数据的形式是什么?如果你能给我一个输入的小例子,我可能会告诉你w怎么办
此外,您应该真正使用数组和对象文本,而不是array
和object
构造函数
var ct = {};
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};
for (var prop in ct) {
if (ct.hasOwnProperty(prop)) {
alert(ct[prop]);
}
}