jQuery多维对象和多维数组

9

我正在尝试构建一个相对高级的“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>

当“USA/usa”是“MOBILISATION”,“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;

如您所见,我已经使用push将objects数组。显然,这不会给我想要的结果。因为这是我第一次使用jQuery对象,所以我有点迷茫。

有什么最好的解决方案?

4个回答

11

var objects = []; 改为 var objects = {};,并且修改

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

你在处理 JSON 对象时遇到的问题是使用变量索引设置属性。你可以使用数组表示法来解决这个问题,如上所示。


6

您的数据集是一个对象,而不是一个数组 - 您无法对其进行push操作。此外,您的变量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对象,但这取决于您的输入和输出格式。

我需要日期对象,因为我的x轴属性模式是“时间”(必须为Flot插件工作)。使用您的代码,图形容器和类别都可以很好地绘制。我的下一个问题是日期对象。由于插件无法将y轴上的字符串“hh:mm”识别为时间,因此图表中没有数据/条形图/线条。等我想出解决方法后,我会将您的答案标记为正确的(尽管通过阅读其他答案,它们可能也是正确的)。谢谢。 - Kasper Skov
嗯,是的,无法让它工作。您有任何想法该怎么办吗?我尝试将其转换为日期对象并为插件y轴设置日期格式属性。但没有成功。 - Kasper Skov
不是我。但我认为这会很有用,因为已经存在一些时间问题 - 尽管它们处理日期时间,而不是每天的时间 :-) - Bergi
是的,我需要一个时间跨度。谢谢你的帮助,伙计! - Kasper Skov

1
function convertObject(obj, key) {
    let returnObje = {};
    if (!key) key = "";
    else key = key + "_";
    Object.keys(obj).forEach(function (k1) {
        if (obj[k1] != null && typeof obj[k1] == "object") {
            returnObje = Object.assign({}, returnObje, convertObject(obj[k1], key + k1))
        } else
            returnObje[key + k1] = obj[k1];
    });
    return returnObje;
}

var hotels = { 
                     "hilton": {"name": "hilton hotel" },
                     "newton": {"name": "newton hotel"}
                 };

convertObject(hotels);

1
这篇文章缺少解释。 - mickmackusa

1

尝试

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

1
这篇文章缺少解释。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接