что делает уравнение внутри d3.nest (). records ()? - PullRequest
1 голос
/ 29 марта 2020

У меня есть вопрос об уравнении в записи () из d3.nest ().

Насколько я знаю, в скобках от "записи ()" находится имя массива, который я собираюсь внести. Однако в следующем примере это ставит уравнение. Почему гнездо не работает, когда я заменяю его просто «данными»? Если бы я мог понять, что делает уравнение, мне было бы легче понять.

код такой, как показано ниже.

var x,
    y,
    duration = 1500,
    delay = 500;



var svg = d3.select("body").append("svg")
    .attr("width", w + m[1] + m[3])
    .attr("height", h + m[0] + m[2])
  .append("g")
    .attr("transform", "translate(" + m[3] + "," + m[0] + ")");

var stocks,
    symbols;

// A line generator, for the dark stroke.
var line = d3.svg.line()
    .interpolate("basis")
    .x(function(d) { return x(d.date); })
    .y(function(d) { return y(d.price); });

// A line generator, for the dark stroke.
var axis = d3.svg.line()
    .interpolate("basis")
    .x(function(d) { return x(d.date); })
    .y(h);

// A area generator, for the dark stroke.
var area = d3.svg.area()
    .interpolate("basis")
    .x(function(d) { return x(d.date); })
    .y1(function(d) { return y(d.price); });

d3.csv("stocks.csv", function(data) {
  var parse = d3.time.format("%b %Y").parse;

  // Nest stock values by symbol.
  symbols = d3.nest()
      .key(function(d) { return d.symbol; })
      .entries(stocks = data);

  // Parse dates and numbers. We assume values are sorted by date.
  // Also compute the maximum price per symbol, needed for the y-domain.
  symbols.forEach(function(s) {
    s.values.forEach(function(d) { d.date = parse(d.date); d.price = +d.price; });
    s.maxPrice = d3.max(s.values, function(d) { return d.price; });
    s.sumPrice = d3.sum(s.values, function(d) { return d.price; });
  });

  // Sort by maximum price, descending.
  symbols.sort(function(a, b) { return b.maxPrice - a.maxPrice; });

  var g = svg.selectAll("g")
      .data(symbols)
    .enter().append("g")
      .attr("class", "symbol");

  setTimeout(lines, duration);
});

1 Ответ

1 голос
/ 29 марта 2020

Это не уравнение (в математическом смысле), это просто оператор присваивания .

Вы можете ясно увидеть, что это не математическое уравнение, если мы сделаем это:

let x = 2;
x = x + 5;//x is 7 now

Этот x = x + 5 не имеет смысла как уравнение. Здесь происходит то, что мы берем текущее значение x и добавляем к нему 5. В JavaScript, что было бы ближе к уравнению в математическом смысле слова, было бы использовать == или ===.

Возвращаясь к вашему вопросу, вот что у нас есть:

var stocks;//undefined at this point

Затем, когда вы делаете ...

.entries(stocks = data);

... вы просто присваиваете stocks data и передаете это в качестве аргумента entries. С точки зрения метода entries это не имеет абсолютно никакого значения, метод будет вести себя точно так же, если вы просто выполните .entries(data).

Наконец, вы можете видеть, что stocks находится вне d3.csv, поэтому вероятно, здесь происходит то, что человек, который написал этот код, хочет использовать data вне асинхронной функции. Это то, что мы обычно видим, когда программисты не любят или не знают, как справляться с асинхронной природой этих методов.

...