【问题标题】:jQuery multidimensional object with multidimensional arrays具有多维数组的 jQuery 多维对象
【发布时间】:2012-07-23 19:36:36
【问题描述】:

我正在尝试构建一个有点高级的“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 to objects 数组。显然,这并没有给我想要的结果。我有点迷失了,因为这是我第一次使用 jQuery 对象。

什么是最好的解决方案?

【问题讨论】:

    标签: jquery flot


    【解决方案1】:

    var objects = []; 更改为var objects = {}; 并改变

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

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

    JSON 对象的问题在于使用变量索引设置属性。如上所述,您可以使用数组表示法来执行此操作。

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

      • 这篇文章缺少解释。
      【解决方案3】:

      您的数据集是一个对象,而不是一个数组 - 您无法推送到它。此外,您的变量 categoryName 不能像那样工作(在 dot and bracket notation 上阅读更多内容)。试试这个:

      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 插件工作)。使用开箱即用的代码,可以很好地绘制图形容器和类别。我的下一个问题是 Date 对象。图中没有数据/条/线,因为插件无法将 y 轴上的字符串“hh:mm”识别为时间。给我一点时间来弄清楚并错误地将您的答案标记为正确(即使所有其他答案也可能是正确的,只需阅读它们)。谢谢
      • 嗯,是的,它无法正常工作。你知道该怎么做吗?我尝试将其转换为 Date 对象并为插件 y 轴设置日期格式属性。没有运气
      • 不,不是我。但我认为这会很好,已经有some on time issues - 但他们处理日期时间,而不是一天中的时间:-)
      • 是的。猜猜我需要的是一个时间跨度。感谢您的帮助伙伴!
      【解决方案4】:

      试试

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

      【讨论】:

      • 这篇文章缺少解释。
      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多