Alguém pode explicar a diferença entre datum () e data () no D3.js. Vejo os dois sendo usados e não sei por que você deve escolher um sobre o outro?
javascript
d3.js
josephmisiti
fonte
fonte
enter()
, o d3 vinculará o restante dos elementos da matriz aos elementos SVG recém-criados.Depois de analisar um pouco isso, descobri que as respostas aqui no SO não estão completas, pois só cobrem o caso quando você invoca
selection.data
eselection.datum
com umdata
parâmetro de entrada . Mesmo nesse cenário, os dois se comportam de maneira diferente se a seleção é um único elemento e quando contém vários elementos. Além disso, esses dois métodos também podem ser chamados sem nenhum argumento de entrada, a fim de consultar os dados / dados vinculados na seleção; nesse caso, eles novamente se comportam de maneira diferente e retornam coisas diferentes.Editar - Publiquei uma resposta um pouco mais detalhada para esta pergunta aqui , mas a postagem abaixo captura praticamente todos os pontos-chave sobre os dois métodos e como eles diferem entre si.
Ao fornecer
data
como argumento de entradaselection.data(data)
tentará executar um data-junção entre os elementos dodata
array com a seleção resultando na criação deenter()
,exit()
eupdate()
seleções que você pode posteriormente operar. O resultado final disso é que, se você passar em uma matrizdata = [1,2,3]
, é feita uma tentativa de associar cada elemento de dados individual (ou seja, dados) à seleção. Cada elemento da seleção terá apenas um único elemento de dadodata
vinculado a ele.selection.datum(data)
ignora completamente o processo de junção de dados. Isso simplesmente atribui a totalidadedata
a todos os elementos na seleção como um todo, sem dividi-los, como no caso de junções de dados. Portanto, se você deseja vincular uma matriz inteiradata = [1, 2, 3]
a cada elemento DOM no seuselection
,selection.datum(data)
conseguirá isso.Ao fornecer nenhum
data
argumento de entradaselection.data()
pegará o dado vinculado para cada elemento na seleção e os combinará em uma matriz retornada. Assim, se seuselection
inclui 3 elementos DOM com os dados"a"
,"b"
e"c"
obrigado a cada respectivamente,selection.data()
retornos["a", "b", "c"]
. É importante observar que, seselection
é um único elemento com (por exemplo) o dado"a"
vinculado a ele, eleselection.data()
retornará["a"]
e não"a"
como alguns podem esperar.selection.datum()
só faz sentido para uma única seleção, pois é definida como retornando o dado vinculado ao primeiro elemento da seleção. Portanto, no exemplo acima, com a seleção que consiste em elementos DOM com dados vinculados de"a"
,"b"
e"c"
,selection.datum()
simplesmente retornaria"a"
.Esperamos que isso ajude a esclarecer como
selection.data
eselection.datum()
diferir um do outro ao fornecer dados como um argumento de entrada e ao consultar o dado vinculado por não fornecer nenhum argumento de entrada.PS - A melhor maneira de entender como isso funciona é começar com um documento HTML em branco no Chrome, abrir o console e tentar adicionar alguns elementos ao documento e começar a vincular dados usando
selection.data
eselection.datum
. Às vezes, é muito mais fácil "grok" algo fazendo do que lendo.fonte
Aqui estão alguns bons links:
Boa discussão sobre o D3 "data ()": Entendendo como o D3.js vincula dados a nós
D3 para meros mortais
Wiki D3 de Mike Bostock
Por este último:
fonte
Eu acho que a explicação dada por HamsterHuey é a melhor até agora. Para expandir e fornecer uma representação visual das diferenças, criei um documento de exemplo que ilustra pelo menos parte das diferenças entre
data
edatum
.A resposta abaixo é mais uma opinião derivada do uso desses métodos, mas fico feliz em ser corrigido se estiver errado.
Este exemplo pode ser executado abaixo ou neste Fiddle .
Eu acho que
datum
é mais simples de entender, uma vez que não faz uma junção, mas é claro que isso também significa que ele tem diferentes casos de uso.Para mim, uma grande diferença - embora exista mais - é o fato de que
data
é apenas a maneira natural de fazer atualizações (ao vivo) em um gráfico d3, pois todo o padrão de entrada / atualização / saída simplifica quando você o obtém.datum
por outro lado, parece-me mais adequado para representações estáticas. No exemplo abaixo, por exemplo, eu poderia obter o mesmo resultado, fazendo um loop na matriz original e acessando os dados pelo índice da seguinte forma:Experimente aqui: https://jsfiddle.net/gleezer/e4m6j2d8/6/
Mais uma vez, acho que isso é muito mais fácil de entender, pois você se livra da carga mental proveniente do padrão de entrada / atualização / saída, mas assim que precisar atualizar ou alterar a seleção, certamente será melhor recorrer
.data()
.fonte