Adakah yang bisa menjelaskan perbedaan antara datum () dan data () di D3.js? Saya melihat keduanya digunakan dan saya tidak yakin mengapa Anda harus memilih yang satu dari yang lain?
javascript
d3.js
josephmisiti
sumber
sumber
enter()
, d3 akan mengikat elemen array lainnya dengan elemen SVG yang baru dibuat.Setelah melihat ini sedikit, saya telah menemukan bahwa jawaban di sini pada SO tidak lengkap karena mereka hanya membahas kasus ketika Anda memohon
selection.data
danselection.datum
dengandata
parameter input . Bahkan dalam skenario itu, keduanya berperilaku berbeda jika seleksi adalah elemen tunggal versus ketika mengandung banyak elemen. Selain itu, kedua metode ini juga dapat dipanggil tanpa argumen input apa pun untuk meminta data / datum terikat dalam seleksi, dalam hal ini mereka sekali lagi berperilaku berbeda dan mengembalikan hal-hal yang berbeda.Sunting - Saya memposting jawaban yang sedikit lebih terperinci untuk pertanyaan ini di sini , tetapi posting di bawah ini cukup banyak menangkap semua poin kunci mengenai dua metode dan bagaimana mereka berbeda satu sama lain.
Saat memasok
data
sebagai argumen inputselection.data(data)
akan berusaha melakukan penggabungan data antara elemen-elemendata
array dengan seleksi yang menghasilkan pembuatanenter()
,exit()
danupdate()
seleksi yang selanjutnya dapat Anda operasikan. Hasil akhir dari ini adalah jika Anda meneruskan dalam arraydata = [1,2,3]
, upaya dilakukan untuk bergabung dengan setiap elemen data individu (yaitu datum) dengan seleksi. Setiap elemen dari seleksi hanya akan memiliki satu elemen datum yangdata
terikat padanya.selection.datum(data)
melewati proses penggabungan data sekaligus. Ini hanya menetapkan keseluruhandata
untuk semua elemen dalam pemilihan secara keseluruhan tanpa membaginya seperti dalam kasus data-bergabung. Jadi jika Anda ingin mengikat seluruh arraydata = [1, 2, 3]
ke setiap elemen DOM di Andaselection
, makaselection.datum(data)
akan mencapai ini.Saat memasok tidak ada
data
argumen inputselection.data()
akan mengambil datum terikat untuk setiap elemen dalam seleksi dan menggabungkannya ke dalam array yang dikembalikan. Jadi, jika Andaselection
menyertakan 3 elemen DOM dengan data"a"
,"b"
dan"c"
terikat masing-masing,selection.data()
kembali["a", "b", "c"]
. Penting untuk dicatat bahwa jikaselection
merupakan elemen tunggal dengan (sebagai contoh) datum"a"
terikat padanya, makaselection.data()
akan kembali["a"]
dan tidak"a"
seperti yang diperkirakan beberapa orang.selection.datum()
hanya masuk akal untuk satu seleksi karena didefinisikan sebagai mengembalikan datum yang terikat ke elemen pertama seleksi. Jadi dalam contoh di atas dengan pemilihan yang terdiri dari elemen DOM dengan datum terikat"a"
,"b"
dan"c"
,selection.datum()
hanya akan kembali"a"
.Semoga ini membantu memperjelas bagaimana
selection.data
danselection.datum()
berbeda satu sama lain ketika memberikan data sebagai argumen input dan ketika meminta datum terikat dengan tidak memberikan argumen input.PS - Cara terbaik untuk memahami cara kerjanya adalah mulai dengan dokumen HTML kosong di Chrome dan membuka konsol dan mencoba menambahkan beberapa elemen ke dokumen dan kemudian mulai mengikat data menggunakan
selection.data
danselection.datum
. Terkadang, jauh lebih mudah untuk "grok" sesuatu dengan melakukan daripada membaca.sumber
Berikut ini beberapa tautan bagus:
Diskusi yang bagus tentang D3 "data ()": Memahami bagaimana D3.js mengikat data ke node
D3 untuk Mere Mortals
D3 Wiki dari Mike Bostock
Per yang terakhir:
sumber
Saya pikir penjelasan yang diberikan oleh HamsterHuey adalah yang terbaik sejauh ini. Untuk memperluas dan memberikan representasi visual dari perbedaan, saya membuat dokumen sampel yang menggambarkan setidaknya sebagian dari perbedaan antara
data
dandatum
.Jawaban di bawah ini lebih merupakan pendapat yang berasal dari menggunakan metode ini, tetapi saya senang bisa diperbaiki jika saya salah.
Contoh ini dapat dijalankan di bawah atau di Fiddle ini .
Saya pikir itu
datum
lebih mudah untuk dipahami karena tidak bergabung, tetapi tentu saja ini juga berarti memiliki kasus penggunaan yang berbeda.Bagi saya satu perbedaan besar - walaupun ada lebih banyak - adalah kenyataan bahwa itu
data
adalah cara alami untuk melakukan pembaruan (langsung) pada grafik d3, karena keseluruhan pola masuk / perbarui / keluar membuatnya mudah, setelah Anda mendapatkannya.datum
di sisi lain menurut saya lebih cocok untuk representasi statis. Dalam contoh di bawah ini misalnya saya bisa mencapai hasil yang sama dengan pengulangan pada array asli dan mengakses data dengan indeks seperti ini:Cobalah di sini: https://jsfiddle.net/gleezer/e4m6j2d8/6/
Sekali lagi, saya pikir ini adalah cara yang lebih mudah untuk dipahami karena Anda terbebas dari beban mental yang datang dari pola masuk / perbarui / keluar, tetapi segera setelah Anda perlu memperbarui atau mengubah pilihan Anda pasti akan lebih baik menggunakan
.data()
.sumber