Может кто-нибудь объяснить, пожалуйста, разницу между datum () и data () в D3.js? Я вижу, как используются оба, и я не уверен, почему вы должны выбрать один из других?
javascript
d3.js
josephmisiti
источник
источник
enter()
, d3 свяжет остальные элементы массива с вновь созданными элементами SVG.Посмотрев немного, я обнаружил, что ответы на SO здесь неполные, поскольку они охватывают только случай, когда вы вызываете,
selection.data
иselection.datum
с входнымdata
параметром. Даже в этом сценарии они ведут себя по-разному, если выделение представляет собой один элемент, и если оно содержит несколько элементов. Более того, оба этих метода также могут быть вызваны без каких-либо входных аргументов для запроса связанных данных / данных в выборе, и в этом случае они снова ведут себя по-разному и возвращают разные вещи.Изменить - я разместил чуть более подробный ответ на этот вопрос здесь , но пост ниже в значительной степени отражает все ключевые моменты, касающиеся двух методов и того, как они отличаются друг от друга.
При поставке
data
как качестве входного аргументаselection.data(data)
будет пытаться выполнить соединение данных между элементамиdata
массива с выбором, результатом которого будет созданиеenter()
,exit()
и сupdate()
выборками, с которыми вы впоследствии сможете работать. Конечный результат этого, если вы передаете в массивеdata = [1,2,3]
, когда делается попытка соединить каждый отдельный элемент данных (т. Е. Данные) с выбором. Каждый элемент выбора будет иметь только один элемент привязки,data
связанный с ним.selection.datum(data)
обходит процесс присоединения данных в целом. Это просто присваивает совокупностьdata
всем элементам в выделении в целом, не разделяя его, как в случае объединения данных. Так что если вы хотите привязать весь массивdata = [1, 2, 3]
к каждому элементу DOM в вашемselection
, тоselection.datum(data)
добьетесь этого.При
data
вводе без входного аргументаselection.data()
возьмет привязанные данные для каждого элемента в выделении и объединит их в массив, который возвращается. Таким образом, если вашselection
включает в себя 3 DOM элементов с данными"a"
,"b"
и"c"
связаны друг с соответственно,selection.data()
возвращается["a", "b", "c"]
. Важно отметить, что еслиselection
это один элемент с (в качестве примера)"a"
привязанным к нему датумом , тоselection.data()
он вернет["a"]
а не так,"a"
как некоторые ожидают.selection.datum()
имеет смысл только для одного выбора, так как он определен как возвращение данных, привязанных к первому элементу выбора. Таким образом, в приведенном выше примере с выбором, состоящим из элементов DOM со связанным значением"a"
,"b"
и"c"
,selection.datum()
просто вернет"a"
.Надеемся, что это поможет прояснить, как
selection.data
и чем ониselection.datum()
отличаются друг от друга как при предоставлении данных в качестве входного аргумента, так и при запросе связанных данных, не предоставляя никаких входных аргументов.PS. Лучший способ понять, как это работает, - начать с пустого HTML-документа в Chrome, открыть консоль и попробовать добавить несколько элементов в документ, а затем начать связывать данные с помощью
selection.data
иselection.datum
. Иногда гораздо проще «прогнать» что-то, чем читать.источник
Вот несколько хороших ссылок:
Хорошее обсуждение D3 "data ()": понимание того, как D3.js связывает данные с узлами
D3 для простых смертных
Вики Майка Бостока D3
По последнему:
источник
Я думаю, что объяснение, данное HamsterHuey, пока лучшее. Чтобы расширить его и наглядно представить различия, я создал образец документа, который иллюстрирует хотя бы часть различий между
data
иdatum
.Приведенный ниже ответ является скорее мнением, полученным при использовании этих методов, но я рад, что меня исправят, если я ошибаюсь.
Этот пример можно запустить ниже или в этой скрипке .
Я думаю, что
datum
это проще понять, так как это не делает соединение, но, конечно, это также означает, что у него разные варианты использования.Для меня одно большое отличие - хотя есть и большее - заключается в том, что
data
это просто естественный способ делать (живые) обновления на графике d3, поскольку весь шаблон ввода / обновления / выхода делает его простым, как только вы его получите.datum
с другой стороны, мне кажется, больше подходит для статических представлений. Например, в приведенном ниже примере я мог бы добиться того же результата, если бы зацикливался на исходном массиве и обращался к данным по индексу следующим образом:Попробуйте это здесь: https://jsfiddle.net/gleezer/e4m6j2d8/6/
Опять же, я думаю, что это гораздо проще понять, поскольку вы освобождаетесь от умственного бремени, возникающего из шаблона ввода / обновления / выхода, но как только вам нужно обновить или изменить выбор, вам наверняка будет лучше прибегнуть к помощи
.data()
.источник