Как получить минимальное и максимальное значение между заданным диапазоном в наборе данных в d3.js

У меня есть набор данных в формате:

[{
  x: "2014-01-01",
  y: 1223 
},
 ...
 {x: "2017-01-01",
  y: 143
 }
 ];

и учитывая диапазон, например

["2015-01-01","2016-01-01"]

Я хотел бы найти минимальное и максимальное значение y между этими двумя диапазонами.

Как это сделать в d3?

в настоящее время я использую следующую функцию, чтобы найти мин. / макс.

d3.min(formattedData, function(d) { return d.y; }), 

d3.max(formattedData, function(d) { return d.y; });

Я не уверен, как применить диапазон там

даты уже проанализированы, поэтому не беспокойтесь об этой части

Я применяю следующую функцию ко всем значениям x, т.е. parseDate.parse (x)

parseDate = d3.time.format('%Y-%m-%d');

person james    schedule 08.06.2018    source источник


Ответы (2)


Если ваш список очень длинный и вы не хотите повторять его более одного раза, вы можете сделать все это за один вызов:

<!DOCTYPE html>
<html>

<head>
  <script data-require="[email protected]" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
</head>

<body>
  <script>
    var input = [{
        x: new Date("2014-01-01"),
        y: 1223
      }, {
        x: new Date("2015-06-01"),
        y: 12
      }, {
        x: new Date("2015-07-01"),
        y: 1025
      }, {
        x: new Date("2015-08-01"),
        y: 125
      }, {
        x: new Date("2017-01-01"),
        y: 143
      }],
      minDate = new Date("2015-01-01"),
      maxDate = new Date("2016-01-01");

    var minMax = d3.extent(input, function(d) {
      if (d.x <= minDate || d.x >= maxDate){
        return NaN;
      }
      return d.y;
    })
    console.log(minMax);
  </script>
</body>

</html>

person Mark    schedule 08.06.2018

У вас есть возможность отфильтровать элементы из вашего массива, чтобы они соответствовали диапазону дат, который вам нужен:

inputArray.filter(d => d.x > "2015-01-01" && d.x < "2016-01-01")

Затем вы можете сопоставить (преобразовать) отфильтрованные элементы, чтобы преобразовать их в связанное с ними значение y:

.map(d => d.y)

Чтобы наконец получить минимальное или максимальное значение результирующего массива:

d3.min(..)

который дает:

var input = [
  {
    x: "2014-01-01",
    y: 1223 
  },
  {
    x: "2015-06-01",
    y: 12
  },
  {
    x: "2015-07-01",
    y: 1025
  },
  {
    x: "2015-08-01",
    y: 125
  },
  {
    x: "2017-01-01",
    y: 143
  }
 ]

var output = input
  .filter(d => d.x > "2015-01-01" && d.x < "2016-01-01")
  .map(d => d.y);

console.log("filter/map array: " + output);
console.log("min: " + d3.min(output));
console.log("max: " + d3.max(output));
<script src="https://d3js.org/d3.v5.min.js"></script>

person Xavier Guihot    schedule 08.06.2018