【问题标题】:Iterating through multi-dimensional arrays with d3.js使用 d3.js 遍历多维数组
【发布时间】:2016-09-23 06:33:16
【问题描述】:

mbostock 最近回答了我关于在 d3 中使用数据的最佳实践的问题,这里是帖子的链接;

https://github.com/d3/d3/issues/2828

但是,尝试遵循他的建议,我仍然对如何迭代他建议的多维数据感到困惑。我现在只是尝试控制台记录数据,并希望有人可以在帖子之后帮助我制作实际示例,相关的 sn-p 可以在下面看到;

您可以有一个单独的国家/地区数组,然后需要一个二维值数组,类似于用于避免重复指定日期的技巧。实际上,您可以将其推广到组织、国家和日期的 n 维矩阵:

 {
      "organizations": ["EA", "EB", "EC"],
      "countries": ["Netherlands", "Belgium", "France"],
      "dates": ["Jan_2016", "Feb_2016", "Mar_2016"],
      "values": [
        [
          [11.7999, 15.0526, 13.2411],
          [25.7713, 24.1374, null],
          [27.6033, 23.6186, 20.2142]
        ],
        [
          [11.7999, 15.0526, 13.2411],
          [25.7713, 24.1374, null],
          [27.6033, 23.6186, 20.2142]
        ]
      ]
    }

我希望这将是最简洁的,但您必须在访问数据时记住维度顺序:

var organization = "EA",
    country = "Netherlands",
    date = "Jan_2016",
    value = data.values[organization][country][date]; // 11.7999

我一直在尝试了解如何实现这一结果,但是由于我对这一切都比较陌生,所以这很困难。我发现的最有用的资源是 > video1 + video2 并尝试使用此 guide 作为参考。

我仍然不知道如何实际执行此操作,而且我不确定 mbostock 建议的数据结构是否不可能,或者我只是遗漏了一些东西(阅读:很多)? (我 99.99% 肯定是后者)。

这就是我想要做的;

http://plnkr.co/edit/2O9Gn28WuMCE1ajOonzY?p=preview

d3.json("data.json", function(error, data) {
  if (error) {
    console.log(error)
  } else {
    console.log(data)
    data = d3.entries(data);
    console.log(data)
  }

  data.forEach(function(d) {
    var org = Object.keys(data[0]);
    console.log(org)
  })

});

所以,据我所知,我需要将 json 转换为数组,然后生成一系列 forEach 循环以将所有内容联系在一起。这是我真正苦苦挣扎的事情,任何帮助都将不胜感激。

我希望一切都得到解释/问题相关,

谢谢

【问题讨论】:

    标签: javascript json sorting d3.js multidimensional-array


    【解决方案1】:

    在这种情况下,一个好的旧 for 循环可能是最清晰的方法:

    for (var organization=0; organization<data.organizations.length; organization++) {
      for (var country=0; country<data.countries.length; country++) {
        for (var date=0; date<data.dates.length; date++) {
           console.log(data.values[organization][country][date]);
        }
      }
    }
    

    请记住,organizationcountrydate 在此处是整数:您可以使用 data.organizations[organization] 访问实际标签。

    有很大的灵活性,您可以重新排序循环并添加中间代码。例如,如果您想为每个组织和日期提取一个数组:

    for (var organization=0; organization<data.organizations.length; organization++) {
      for (var date=0; date<data.dates.length; date++) {
         var group = [];
         for (var country=0; country<data.countries.length; country++) {
           group.push(data.values[organization][country][date]);
         }
         console.log("values for "+data.organizations[organization]+" at time "+data.dates[date]+":")
         console.log(group);
      }
    }
    

    PS:要获取单个国家(或组织或日期)而不是枚举所有,您可以将相应的for循环替换为:

    var country= data.countries.indexOf("france") 
    

    【讨论】:

    • 感谢您的回答!它有效:) - 我猜可以使用条件语句进一步扩展它以显示某些数据?即,如果 $(this) == france && month == jan_2016 那么 value == ...
    • 当然,您可以插入任何条件。如果你从一开始就知道你想要哪个元素,你可以直接使用 indexOf 而不是遍历整个列表(见编辑)
    • 啊,我明白了!好吧,我认为这就是我需要的一切,非常感谢您提供了巨大的帮助!
    猜你喜欢
    • 2012-04-16
    • 2019-08-08
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多