jQuery многоизмерен обект с многоизмерни масиви

Опитвам се да изградя донякъде усъвършенствана графика за включване на Flot jQuery. За това имам нужда от многоизмерен обект (или поне мисля, че е).

Структурата трябва да изглежда така:

var datasets = {
        "usa": {
            label: "USA",
            data: [[1988, 483994], [1989, 479060], [1990, 457648], [1991, 401949], [1992, 424705], [1993, 402375], [1994, 377867], [1995, 357382], [1996, 337946], [1997, 336185], [1998, 328611], [1999, 329421], [2000, 342172], [2001, 344932], [2002, 387303], [2003, 440813], [2004, 480451], [2005, 504638], [2006, 528692]]
        },        
        "russia": {
            label: "Russia",
            data: [[1988, 218000], [1989, 203000], [1990, 171000], [1992, 42500], [1993, 37600], [1994, 36600], [1995, 21700], [1996, 19200], [1997, 21300], [1998, 13600], [1999, 14000], [2000, 19100], [2001, 21300], [2002, 23600], [2003, 25100], [2004, 26100], [2005, 31100], [2006, 34700]]
        }
};

От моя код зад генерирах някои списъци, изглеждащи така (не са същите данни, но нямате нищо против):

<ul id="MOBILISATION">
  <li data-key="2012/3/27">02:10</li>
  <li data-key="2012/3/28">05:25</li>
  <li data-key="2012/3/29">09:21</li>
  <li data-key="2012/3/30">00:00</li>
  <li data-key="2012/3/31">00:00</li>
</ul>
<ul id="OPERATIONS">
  <li data-key="2012/3/27">19:51</li>
  <li data-key="2012/3/28">18:35</li>
  <li data-key="2012/3/29">14:39</li>
  <li data-key="2012/3/30">07:46</li>
  <li data-key="2012/3/31">10:26</li>
</ul>

Където САЩ/САЩ е МОБИЛИЗАЦИЯ, 1988 е 2012/3/27 и 483994 е 02:10. Получавате снимка!!??

Опитах се да напиша малко jQuery, но очевидно не работи:

    var objects = [];
    var array = [];
    var categoryName = "";
    $('div#Container ul').each(function () {
        catName = $(this).attr('id');
        $('li', this).each(function () {
            array.push([new Date($(this).data('key')).getTime(), $(this).text()]);
        });

        objects.push({ categoryName: { label: categoryName, data: array} });
    });
    var datasets = objects;

Както можете да видите, използвах натискане към objects масив. Очевидно това не ми дава желания резултат. Някак си губя всичко нагоре и надолу в това, тъй като за първи път работя с jQuery обекти.

Какво е най-доброто решение за това?


person Kasper Skov    schedule 25.07.2012    source източник


Отговори (4)


Вашите набори от данни са обект, а не масив - не можете да го натиснете. Освен това вашата променлива categoryName не работи така (прочетете повече за нотация с точки и скоби). Опитайте тази:

var datasets = {};
$('div#Container ul').each(function () {
    catName = this.id;
    var array = [];
    $('li', this).each(function () {
        array.push([
          new Date($(this).data('key')).getTime(),
          $(this).text()
        ]);
    });
    datasets[catName.toLowercase()] = {
        label: catName.toUppercase(),
        data: array
    };
});

Освен това не съм сигурен дали наистина ще трябва да създавате Date обекти, но това зависи от вашия входен и изходен формат.

person Bergi    schedule 25.07.2012
comment
Имам нужда от обекта за дата, защото имам своя режим на свойство по оста x във времето (трябва, за да работи приставката Flot). С вашия код направо от кутията, графичният контейнер и категориите са начертани добре. Следващият ми проблем е обектът Date. В графиката няма данни/ленти/линии, защото приставката не може да разпознае низа hh:mm на оста y като време. Дайте ми секунда, за да го разбера и ще маркирам отговора ви като правилен (Въпреки че всички други отговори вероятно също са верни, само като ги прочетете). Благодаря - person Kasper Skov; 25.07.2012
comment
Хм, да, не мога да го накарам да работи. Имаш ли идея какво да правиш? Опитах се да го конвертирам в обект Date и да задам свойството за формат на датата за y-ос на добавките. Без късмет - person Kasper Skov; 25.07.2012
comment
Не, не аз. Но мисля, че това би било добре, вече има някои проблеми с времето - но те обработват дати и часове, а не часове от деня :-) - person Bergi; 25.07.2012
comment
да Предполагам, че имам нужда от време. Благодаря за помощта ти колега! - person Kasper Skov; 25.07.2012

Променете var objects = []; на var objects = {}; и сменете

objects.push({ categoryName: { label: categoryName, data: array} });

to

objects[categoryName] = { label: categoryName, data: array};

Проблемът, който имате с JSON обектите, е в задаването на свойства с променлив индекс. Можете да използвате нотация на масив, за да направите това, както по-горе.

person Joe Green    schedule 25.07.2012

Опитвам

    var data = {};
    $('div#Container ul').each(function() {
        var sub_obj = data[$(this).attr('id').toLowerCase()] = {
            label: $(this).attr('id').toUpperCase(),
            data: []
        };
        $(this).children('li').each(function() {
            sub_obj.data.push([$(this).data('key'), $(this).text()]);
        });
    });
    console.log(data);
person Mitya    schedule 25.07.2012
comment
В тази публикация липсва обяснението. - person mickmackusa; 16.10.2019

person    schedule
comment
В тази публикация липсва обяснението. - person mickmackusa; 16.10.2019