使用d3.js迭代多维数组

时间:2016-05-25 14:54:25

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

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

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

然而,试图遵循他的建议我仍然困惑如何迭代他建议的多维数据。我现在只是试图控制记录数据,并希望有人可以帮助我在帖子后面制作实际例子,相关的片段可以在下面看到;

  

你可以有一个单独的国家数组,然后需要一个二维数组值,类似于用来避免冗余指定日期的技巧。实际上,您可以将其概括为组织,国家和日期的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循环以将所有内容组合在一起。这就是我真正挣扎的事情,任何帮助都会受到高度赞赏。

我希望所有内容都有解释/问题相关,

由于

1 个答案:

答案 0 :(得分:2)

在这种情况下,一个好的旧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")