30

我是 d3 和 Javascript 的新手。我已经玩过 choropleth 示例,但现在想进行一些更详细的更改。其中之一是找到我用作输入的 JSON 的最大值和最小值。

我的问题很简单,因为对象下方的代码片段已正确输出到 console.log(data) 命令的控制台,但是整个对象也为 min 和 max 语句输出,而不仅仅是 min 和最大限度。

d3.json("data/unemployment_by_state.json", function(data) {   
  console.log(data);
  console.log(d3.min([data]));
  console.log(d3.max([data]));
});

这是 JSON 对象的片段:

{"01":32710,"02":20280,"03":18002}

我想要帮助的是理解为什么 d3.min([data]) 和 d3.max([data]) 导致整个对象输出到控制台,而不是数据对象中的最小值和最大值.

提前致谢。

4

3 回答 3

60

如果您的数据是一个数组,那么您的原始代码将起作用,如果您去掉数据周围的括号:

  var data = [32710,20280,18002];

  console.log(data);
  console.log(d3.min(data));
  console.log(d3.max(data));

如果您需要使用键“01”、“02”、“03”来识别数组值,请创建一个对象数组,并对这些值进行操作以获得最小值/最大值:

   //data as key/value pairs
   var data = [
     {key: "01",  value:  32710},
     {key: "02",  value:  20280},
     {key: "03",  value: 18002}
  ];

  console.log(data);
  console.log(d3.min(data, function(d) { return d.value; }));
  console.log(d3.max(data, function(d) { return d.value; }));

  // AND IF YOU WANT THE min/max of the KEYS:
  console.log(d3.min(data, function(d) { return d.key; }));
  console.log(d3.max(data, function(d) { return d.key; }));
于 2014-07-14T19:49:05.707 回答
47

d3.min()andd3.max()函数作用于数组,而不是对象。您似乎试图通过将data对象包装在一个数组(例如d3.max([data]))中来解决这个问题,但这实际上是在说“给我一个具有一个值(数据对象)的数组的最大值”。由于数组中只有一个值,因此返回该值。

如果您只想要对象中的最大值/最小值,您可以使用该d3.values()函数将数据中的所有值提取为一个数组,然后取该数组中的最大值:

var max = d3.max(d3.values(data)); 
// 32710

如果您还想知道键,您可能需要使用d3.entries()创建一个对象数组{ key, value },然后对它们进行排序并取顶部:

// create an array of key, value objects
var max = d3.entries(data)
    // sort by value descending
    .sort(function(a, b) { return d3.descending(a.value, b.value); })
    // take the first option
    [0];
// { key: "01", value: 32710 }
于 2012-07-15T06:53:32.230 回答
0

我也是 d3 和 JavaScript 的新手,但我找到了一种解决方法来找到包含对象的三行的最小值和最大值,使用d3.extentand .concat

y.domain(
  d3.extent(
    d3.extent(data, function(d) {
      return d.line1;     })
    .concat(d3.extent(data, function(d) {
      return d.line2;     })
            .concat(d3.extent(data, function(d) {
      return d.line3;     })
                   ))
  ));

于 2015-09-11T12:49:28.600 回答