Вопрос

Это мой фрагмент кода, где программа не входит в петлю FORACH:

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

Можете ли вы помочь мне реализовать решение для итерации над массивами со всеми видами индексов? Моя цель - хранить значения для заданных объектов даты.


Я использую данные для Протовис Библиотека и AFAIK нуждается в массиве в качестве ввода.

Структура данных, которую я использую в примере протовиса, более сложный, чем этот показанный выше.

В моем проекте я отправляю через Javabean набор некоторых объектов. Эти объекты содержат среди прочего, дата. Моя цель - показать эти объекты на графике, как это, представленные на веб-сайте Protovis http: // vis.stanford.edu / protovis / ex / profert.html.

Я буду использовать горизонтальную ось на время, а вертикальную ось для количества объектов в течение определенного времени. Вот почему я хочу иметь массив, отсортированный к дате, поскольку afaik Protovis позволяет только массивам в качестве ввода данных для их диаграмм в режиме по умолчанию - цепочками функции.

Редактировать: на данный момент я изменил метод. Вместо того, чтобы хранить строки как клавиши массивов, я выполняю следующее: настоящим является моим оригинальным фрагментом кода:
редактировать2.: Я добавил какой-либо оригинальный вход: var result2 = {"h": {10 "документов": [11 {12 "Биографические материалы": [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 "innoypeople": [33], 34 "Onlinetitles": [35], 36 "организации": [37], 38 "люди": [39], 40 "публикацияdate": "1990-11-21 00: 00:00 CET", 41 "SourceFile": "0402635.xml", 42 "таксономическиеклассификаторы": [43], 44 "названия": [45 ], 46 «ТипсМэтериал»: [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;
}


редактировать3. Код выше работает сейчас:

В двух словах: я использую массив TLK, чтобы отразить дату индексу. Для одного индекса в массиве RealseTtmp i храните дату и набор объектов, связанных с этой датой. Следующая часть кода, которую я использую для сортировки дат от самого старого до нового и аналогично сортировки результата. Сортированная версия 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, а также для масштабирования с даты ширины графика. Вы можете найти примеры на странице примеров протовис.

Кстати: я запутался, почему в части:

for(key in tlk){
    dates[i] = new Date(key);
    i++;
}

Как последний ключ, который я получаю «Содержит»? Пытался найти ответ в Интернете, без успеха. Медведи объяснили в своем комментарии, что причина, по которой я получаю этот пробелм, заключается в том, что я итарируюсь по свойствам массива.

Это было полезно?

Решение

Массивы JavaScript поддерживают только индексацию по номеру. Когда вы пишете

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

Вы добавляете специальные свойства me а также you к массиву; Вы нет Добавление элементов в массив. (Также используя 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]));
}

Редактировать: Если вы хотите относиться к горизонтальной оси с течением времени, вам действительно не нужно делать гораздо больше работы. Там хороший основной пример здесь; Просмотр источника страницы, чтобы увидеть код. Хитрость вот что, хотя данные действительно представляют собой массив (объектов), X-координата явно указана в качестве свойства, а не в качестве индекса в массиве данных. Каждый элемент в массиве выглядит что-то вроде этого:

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

Источники:


Редактировать 2: Вы до сих пор кажутся смешанными о массивах против объектов.

Что касается вашего «кстати»: когда вы пишете for(key in tlk) ... Вы итерация по ключам, которые уже в массиве. Это относится к массиву в качестве объекта, и это не то, что вы хотите! Понимаете contains потому что вы итерация по свойствам массива, а также contains Это функция, прикрепленная к каждому массиву (вы используете прототип или другую подобную библиотеку?).

Основная проблема, однако, вы индексируете в массиве (tlk) с использованием даты. Это большая нет-нет; даже если tlk это объект, потому что вы можете использовать только объекты, использующие строки. Отказ Я действительно не понимаю, с чем ты делаешь tlk, Но я не думаю, что вам это нужно вообще. Какова форма ваших входных данных? Если вы можете дать мне небольшой пример ввода, я, вероятно, могу показать вам, что с этим делать.

Кроме того, вы должны действительно использовать литералы на массив и объект, а не Array а также Object конструкторы. Например, используйте var tlk = [] скорее, чем var tlk = new Array();, а также var d = {}; скорее, чем var d = new Object();.

Другие советы

JavaScript не имеет ассоциативных массивов, пар. Предметы назвали свойства, хотя, что аналогично. для каждого() будет ли только переоценивать индексированные свойства. А. for...in петля поможет вам здесь, хотя в целом вы бы избежать использования for...in на массивах потому что Это также итарает по именованным свойствам.

for (var c in ct) {
    if (ct.hasOwnProperty(c)) {
        // do something
    }
}

Смотрите также:

То Array.prototype.forEach Метод проходит массив на его числовые индексы.

Массивы не являются «ассоциативными», если вы хотите назвать свойства со значениями, вы должны использовать простой объект и использовать for-in Заявление для перечисления существующих свойств:

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

for (var prop in ct) {
  if (ct.hasOwnProperty(prop)) {
    alert(ct[prop]);
  }
}

То hasOwnProperty Метод называется, потому что for-in Свойства Traverse Travers, которые унаследованы, таким образом, он перечисляет только свойства, которые физически существуют на объекте (собственные свойства).

Вы можете использовать if (Object.prototype.hasOwnProperty.call(ct, prop)) вместо if (ct.hasOwnProperty(prop)) Для дополнительной безопасности, потому что если объект имеет свойственную собственность «hasOwnProperty«Не будет методом, который вы хотите выполнить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top