Может кто-нибудь объяснить разницу между 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. Иногда гораздо легче "заглядывать" чем-то, чем читать.