В d3. js, ввод () выбор не пуст при повторном добавлении тех же данных в выбор? - PullRequest
0 голосов
/ 24 января 2020

Я обнаружил поведение в d3. js v5, которое я не совсем понимаю. Это легче всего объяснить на коротком примере: во-первых, я создаю новый элемент на пустой странице html, в данном случае абзац:

d3.selectAll("body").selectAll("p")
  .data([null])
  .enter()
  .append("p");

Это создает один новый элемент абзаца. Затем я выбираю созданный элемент и «обновляю» данные, чтобы они были такими же, как и раньше, вот так:

var enterSelection = d3.selectAll("body").selectAll("p")
  .data([null])
  .enter();

В моем понимании, enterSelection теперь будет пустой выборкой, потому что вновь добавленные данные точно такие же как тот, который уже прикреплен к абзацу выделения и, следовательно, также имеет такую ​​же длину. Однако enterSelection не является пустым.

Я получаю что-то не так о том, как и когда создаются вводные выборки? До сих пор я понимал, что выбор ввода создается только в том случае, если добавленный массив данных больше, чем массив, уже прикрепленный к выбранному.

РЕДАКТИРОВАТЬ

Использование enterSelection.size() на самом деле дает размер 0, спасибо @Andrew Reid. Однако то, что меня смутило (и именно так я и проверил), было результатом

d3.selectAll("body").selectAll("p")
  .data([null])

в веб-инспекторе, который выглядит следующим образом, прежде чем какие-либо элементы абзаца появятся на странице:

Selection {_groups: Array(1), _parents: Array(1), _enter: Array(1), _exit: Array(1)}
  _enter: [Array(1)]
  _exit: [Array(0)]
  _groups: [Array(1)]
  _parents: [body]
  __proto__: Object

Это заставило меня подумать, что и выбор входа, и выход имели размер 1 при вызове упомянутого фрагмента кода после элемент абзаца был создан, потому что в этом случае он дает:

Selection {_groups: Array(1), _parents: Array(1), _enter: Array(1), _exit: Array(1)}
  _enter: [Array(1)]
  _exit: [Array(1)]
  _groups: [Array(1)]
  _parents: [body]
  __proto__: Object

Однако, при более тщательном анализе я обнаружил, что

  • при первоначальном создании абзаца, массив _enter в выделении равен [EnterNode], а массив _exit равен [] тогда как
  • в последнем случае оба массива на самом деле [empty].

Я нахожу странным, что в одном случае пустой массив отображается как [], а в в другом случае это отображается как [empty]. Есть ли в этом более глубокий смысл, или я должен просто принять это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...