这是我的代码段,程序未进入foreach循环:

var ct = new Array();
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};
ct.forEach(function (c){
    document.getElementById("tmp").appendChild(document.createTextNode(c));
});


当我将数组索引从字符串(“ me”,“ you”)更改为整数时,它可以工作:

var ct = new Array();
ct[0]= {"name" : "Jakub"};
ct[1]= {"name" : "stack"};
ct.forEach(function (c){
    document.getElementById("tmp").appendChild(document.createTextNode(c));
});


您能帮我实现用各种索引遍历数组的解决方案吗?我的目的是存储给定日期对象的值。



我将数据用于库和AFAIK,它需要一个数组作为输入。

我在protovis示例中使用的数据结构比上面显示的复杂。

在我的项目中,我通过JavaBean发送一些对象的集合。这些对象除其他外还包含日期。我的目标是在protovis网站http:// vis.stanford.edu / protovis / ex / area.html上呈现的图形上显示这些对象。

我将使用水平轴作为时间,使用垂直轴作为给定时间的对象数。这就是为什么我要按日期对数组进行排序的原因,因为AFAIK protovis仅允许在默认模式下使用数组作为函数图的数据输入-函数链接。

编辑:
现在,我更改了方法。我不是将字符串存储为数组键,而是执行以下操作:
这是我的原始代码段:
edit2:我添加了一些原始输入:
var result2 = {“ h”:{
10个“文档”:[
11 {
12“ biographicalCategories”:[
13],
14“机构”:“希腊的保守政府已下令调查以色列情报局和希腊军方于1955年达成的一项协议,以建立一个游击网络,以在发生战争时与入侵的华沙条约组织进行战斗。”,
15个“描述符”:[
16],
17个“ generalOnlineDescriptors”:[
18],
19“ guid”:0,
20“标题”:“希腊调查游击战争计划”,
21个“位置”:[
22“希腊”
23],
24个“名称”:[
25],
26个“ onlineDescriptors”:[
27],
28个“ onlineLocations”:[
29],
30个“在线组织”:[
31],
32“ onlinePeople”:[
33],
34“ onlineTitles”:[
35],
36个“组织”:[
37],
38“人民”:[
39],
40“ publicationDate”:“ 1990-11-21 00:00:00.0 CET”,
41“ sourceFile”:“ 0402635.xml”,
42个“分类法分类器”:[
43],
44个“标题”:[
45],
46“ typesOfMaterial”:[
47],
48“得分”:0.80242133
49},


var resultTmp = new Array();
var i = 0;
var averageScore = 0;

var startDate = new Date();
var endDate = new Date(1700, 01, 01);
var docDate;
var actDate;

var tlk = new Array();
var av = 0;
var d = new Object();

result2.h.documents.forEach(function(c) {
    averageScore += c.score;
  if(typeof(c.publicationDate) != "undefined"){
    docDate = c.publicationDate.split("-");
    actDate = new Date(docDate[0], docDate[1]-1, docDate[2].split(" ")[0]);
    if(actDate  endDate){
        endDate = actDate;
    }
    if(defined(tlk[actDate])){
        av = tlk[actDate];
        resultTmp[av].docs.push(c);
    }
    else {
        d = new Object();
        d.date = actDate;
        d.docs = new Array();
        d.docs.push(c);
        resultTmp[i] = d;
        tlk[actDate] = i;
        i++;
    }
  }
});

i = 0;
var dates = [];
for(key in tlk){
    if(key )
        d = new Date(key);
    if(isValidDate(d)){
    dates[i] = new Date(key);
    i++;
    }
}
dates.sort(function (a, b) {
    return a > b;
});

var ii = 0;
i = 0;
var ddocs;
var result = new Array();
for(i=0; i maxDocsPerDate){
            maxDocsPerDate = d.docs.length;
        }
        result[i] = d;
}




edit3上面的代码现在可以正常工作:

简而言之:我使用tlk数组将日期反映到索引。对于resultTmp数组中的一个索引,我存储日期和与该日期相关的对象集。
我使用的下一部分代码将日期从最旧的到最新的进行排序,并类似地对resultTemp进行排序。 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++;
}


作为最后一个键,我得到“包含”?试图在Internet上找到答案,但没有成功。
Bears在他的评论中解释说,得到这个探针的原因是因为我正在遍历数组的属性。

最佳答案

JavaScript数组仅支持按数字编制索引。当你写

ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};


您正在将临时属性meyou添加到数组;您没有在数组中添加元素。 (也使用new Array()构造函数有点奇怪。如果需要数组,请使用[]文字。)

听起来您应该使用JavaScript对象,而不是数组,但是请注意它们仅支持字符串索引。

var ct = {};
ct['me'] = {name: 'Jakub'};
ct['you'] = {name: 'stack'};

for (var k in ct) {
    document.getElementById('tmp', appendChild(document.createTextNode(ct[k]));
}




编辑:如果要将水平轴视为时间,则实际上不需要做更多的工作。有一个很好的基本示例here;查看页面源代码以查看代码。这里的技巧是,尽管数据实际上是一个(对象的)数组,但是x坐标被明确地声明为属性,而不是数据数组中的索引。数组中的每个元素如下所示:

>>> data[0]
    {x: /* some JavaScript date object */, y: /* some number */ }


资料来源:


http://www.google.com/search?q=protovis+x-axis+time
http://groups.google.com/group/protovis/browse_thread/thread/75ec1518692c2de5
http://graphics.stanford.edu/~mbostock/dates/dates.html




编辑2:您似乎仍然对数组与对象混为一谈。

关于您的“ BTW”:当您写for(key in tlk) ...时,您正在遍历数组中已经存在的键。那把数组当作一个对象,那不是你想要的!您看到contains是因为您要遍历数组的属性,并且contains是附加到每个数组的函数(您使用的是原型还是其他类似的库?)。

但是,基本问题是,您正在使用Date索引到数组(tlk)中。那是很大的禁忌。即使tlk是对象,因为您只能使用字符串为对象建立索引。我真的不了解您使用tlk所做的事情,但我认为您根本不需要它。输入数据的形式是什么?如果您能给我一个输入的小例子,我可能会告诉您如何处理。

另外,您应该真正使用数组和对象文字,而不要使用ArrayObject构造函数。例如,使用var tlk = []而不是var tlk = new Array();,并使用var d = {};而不是var d = new Object();

07-24 09:20