В чем разница между данными D3 и данными?
Может кто-нибудь объяснить разницу между datum() и data() в D3.js? Я вижу, что оба используются, и я не уверен, почему вы должны выбрать один за другим?
Ответы
Ответ 1
Я нашел правильный ответ от самого Майка:
D3 - как работать с структурами данных JSON?
Если вы хотите привязать свои данные к одному элементу SVG, используйте
(...).data([data])
или
(...).datum(data)
Если вы хотите привязать свои данные к нескольким элементам SVG
(...).data(data).enter().append("svg")
.....
Ответ 2
Вот несколько хороших ссылок:
В последнем:
# selection.data([values[, key]])
Объединение указанного массива данных с текущим выбором. указанные значения - это массив значений данных, таких как массив числа или объекты или функцию, возвращающую массив значений.
...
# selection.datum([value])
Получает или задает связанные данные для каждого выбранного элемента. в отличие от selection.data, этот метод не вычисляет объединение (и, следовательно, не вычисляет выбор входа и выхода).
Ответ 3
Посмотрев на это немного, я обнаружил, что ответы здесь на 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)
достигнет этого.
Предупреждение:. Многие считают, что selection.datum(data)
эквивалентен selection.data([data])
, но это верно только в том случае, если selection
содержит один элемент. Если selection
содержит несколько элементов DOM, затем selection.datum(data)
свяжет всего data
для каждого элемента в выборе. В контраст, selection.data([data])
связывает всего data
к первому элементу в selection
. Это согласуется с поведение соединения данных selection.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
имеет один элемент, selection.datum()
и selection.data()
возвращают разные значения. Первый возвращает привязку привязки для выбора ("a"
в приведенном выше примере), тогда как последний возвращает привязку привязки в массиве (["a"]
в примере выше).
Надеюсь, это поможет выяснить, как selection.data
и selection.datum()
отличаются друг от друга как при предоставлении данных в качестве входных аргументов, так и при запросе привязки, не предоставляя никаких входных аргументов.
PS. Лучший способ понять, как это работает, - начать с чистого HTML-документа в Chrome и открыть консоль и попробовать добавить несколько элементов в документ, а затем начать привязывать данные с помощью selection.data
и selection.datum
. Иногда гораздо легче "заглядывать" чем-то, чем читать.