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