это мой фрагмент кода, где программа не входит в цикл foreach:
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 и AFAIK ей нужен массив в качестве входных данных.
Структура данных, которую я использую в примере с 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 "generalOnlineDescriptors": [
18],
19 "гид": 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 "публикация": "1990-11-21 00: 00: 00.0 СЕТ",
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 находится в массиве результатов.
Я представляю данные в протоколе следующим образом:
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++;
}
Как последний ключ, который я получаю, "содержит"? Пытался найти ответ в интернете, но безуспешно.
Медведс объяснил в своем комментарии, что причина, по которой я получаю эту проблему, заключается в том, что я перебираю свойства массива.