Я обнаружил поведение в 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]
. Есть ли в этом более глубокий смысл, или я должен просто принять это?