Какая разница Д3 и базы данных?
может кто-нибудь объяснить разницу между datum() и data() в D3.Джей? Я вижу, как используется, и я не уверен, почему вы должны выбрать один над другим?
4 ответа:
Я нашел правильный ответ здесь от самого Майка:
D3-как работать со структурами данных JSON?
Если вы хотите привязать свои данные к одному элементу SVG, используйте
(...).data([data])
или
(...).datum(data)
Если вы хотите привязать свои данные к нескольким элементам SVG
(...).data(data).enter().append("svg")
.....
вот некоторые хорошие ссылки:
хорошее обсуждение данных D3()": понимание того, как D3.js связывает данные с узлами
в последнем:
# selection.data([values[, key]])
соединяет указанный массив данных с текущим выделением. Этот указанный values-это массив значений данных, таких как массив числа или объекты, или функция, которая возвращает массив значений.
...
# selection.datum([value])
возвращает или задает связанные данные для каждого выбранного элемента. В отличие от выбор.метод данных, этот метод не вычисляет соединение (и таким образом не вычисляет параметры ввода и выхода).
изучив это немного, я обнаружил, что ответы здесь на SO не являются полными, поскольку они охватывают только случай, когда вы вызываете
selection.data
иselection.datum
С помощью
Я думаю, что объяснение, данное HamsterHuey является лучшим до сих пор. Чтобы расширить его и дать визуальное представление о различиях, я создал образец документа, который иллюстрирует по крайней мере часть различий между
data
иdatum
.приведенный ниже Ответ является скорее мнением, полученным из использования этих методов, но я рад быть исправленным, если я ошибаюсь.
этот пример можно запустить ниже или в этом Скрипка.
const data = [1,2,3,4,5]; const el = d3.select('#root'); el .append('div') .classed('a', true) .datum(data) .text(d => `node => data: ${d}`); const join= el .selectAll('div.b') .data(data); join .enter() .append('div') .classed('b', true) .text((d, i) => `node-${i + 1} => data: ${d}`)
думаю, что
datum
проще понять, так как он не выполняет соединение, но, конечно, это также означает, что он имеет разные варианты использования.для меня одна большая разница-хотя есть и больше-это то, что
data
это просто естественный способ делать (живые) обновления на диаграмме d3, так как весь шаблон ввода/обновления/выхода делает его простым, как только вы его получите.
datum
С другой стороны, мне кажется, больше подходит для статических представления. В приведенном ниже примере, Например, я мог бы достичь того же результата, что и мой цикл по исходному массиву и доступ к данным по индексу:data.map((n, i) => { el .append('div') .classed('a', true) .datum(data) .text(d => `node-${n} => data: ${d[i]}`); });
Попробуйте здесь:https://jsfiddle.net/gleezer/e4m6j2d8/6/
опять же, я думаю, что это намного проще понять, поскольку вы свободны от умственной нагрузки, исходящей из шаблона ввода/обновления/выхода, но как только вам нужно обновить или изменить выбор, вам, безусловно, будет лучше прибегнуть к
.data()
.const data = [1,2,3,4,5]; const el = d3.select('#root'); el .append('div') .classed('a', true) .datum(data) .text(d => `node => data: ${d}`); const join= el .selectAll('div.b') .data(data); join .enter() .append('div') .classed('b', true) .text((d, i) => `node-${i + 1} => data: ${d}`)
/* Ignore all the css */ html { font-family: arial; } .l { width: 20px; height: 20px; display: inline-block; vertical-align: middle; margin: 10px 0; } .l-a { background: #cf58e4; } .l-b { background: #42e4e4; } .a { border-bottom: 2px solid #cf58e4; } .b { border-bottom: 2px solid #42e4e4; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.6.0/d3.min.js"></script> <div style="margin-bottom: 20px;"> <span class="l l-a"></span> .datum() <br /> <span class="l l-b"></span> .data() </div> <div id="root"></div>