D3.js - Data Join

A junção de dados é outro conceito importante no D3.js. Ele funciona junto com as seleções e nos permite manipular o documento HTML em relação ao nosso conjunto de dados (uma série de valores numéricos). Por padrão, D3.js dá ao conjunto de dados a maior prioridade em seus métodos e cada item no conjunto de dados corresponde a um elemento HTML. Este capítulo explica as junções de dados em detalhes.

O que é uma junção de dados?

A junção de dados nos permite injetar, modificar e remover elementos (elemento HTML, bem como elementos SVG incorporados) com base no conjunto de dados no documento HTML existente. Por padrão, cada item de dados no conjunto de dados corresponde a um elemento (gráfico) no documento.

Conforme o conjunto de dados muda, o elemento correspondente também pode ser facilmente manipulado. A junção de dados cria um relacionamento próximo entre nossos dados e os elementos gráficos do documento. A junção de dados torna a manipulação dos elementos com base no conjunto de dados um processo muito simples e fácil.

Como funciona a junção de dados?

O objetivo principal da junção de dados é mapear os elementos do documento existente com o conjunto de dados fornecido. Ele cria uma representação virtual do documento em relação ao conjunto de dados fornecido e fornece métodos para trabalhar com a representação virtual. Vamos considerar um conjunto de dados simples, conforme mostrado abaixo.

[10, 20, 30, 25, 15]

O conjunto de dados possui cinco itens e, portanto, pode ser mapeado para cinco elementos do documento. Vamos mapear para oli elemento do seguinte documento usando o método selectAll () do seletor e o método data () da junção de dados.

HTML

<ul id = "list">
   <li><li>
   <li></li>
</ul>

Código D3.js

d3.select("#list").selectAll("li").data([10, 20, 30, 25, 15]);

Agora, existem cinco elementos virtuais no documento. Os primeiros dois elementos virtuais são os doisli elemento definido no documento conforme mostrado abaixo.

1. li - 10
2. li - 20

Podemos usar todos os métodos de modificação de elementos do seletor, como attr(), style(), text(), etc., para os dois primeiros li como mostrado abaixo.

d3.select("#list").selectAll("li")
   .data([10, 20, 30, 25, 15])
   .text(function(d) { return d; });

A função no método text () é usada para obter o lielementos mapeados de dados. Aqui,d representam 10 para o primeiro li elemento e 20 para o segundo li elemento.

Os próximos três elementos podem ser mapeados para quaisquer elementos e isso pode ser feito usando o método enter () da junção de dados e o método append () do seletor. O método enter () dá acesso aos dados restantes (que não são mapeados para os elementos existentes) e o método append () é usado para criar um novo elemento a partir dos dados correspondentes. Vamos criarlipara os demais itens de dados também. O mapa de dados é o seguinte -

3. li - 30
4. li - 25
5. li - 15

O código para criar um novo elemento a li é o seguinte -

d3.select("#list").selectAll("li")
   .data([10, 20, 30, 25, 15])
   .text(function(d) { return "This is pre-existing element and the value is " + d; })
   .enter()
   .append("li")
   .text(function(d) 
      { return "This is dynamically created element and the value is " + d; });

A junção de dados fornece outro método chamado de exit() method para processar os itens de dados removidos dinamicamente do conjunto de dados, conforme mostrado abaixo.

d3.selectAll("li")
   .data([10, 20, 30, 15])
   .exit()
   .remove()

Aqui, removemos o quarto item do conjunto de dados e seu li correspondente usando os métodos exit () e remove ().

O código completo é o seguinte -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         body { font-family: Arial; }
      </style>
   </head>

   <body>
      <ul id = "list">
         <li></li>
         <li></li>
      </ul>
        
      <input type = "button" name = "remove" value = "Remove fourth value" 
         onclick = "javascript:remove()" />
      
      <script>
         d3.select("#list").selectAll("li")
            .data([10, 20, 30, 25, 15])
            .text(function(d) 
               { return "This is pre-existing element and the value is " + d; })
            .enter()
            .append("li")
            .text(function(d) 
               { return "This is dynamically created element and the value is " + d; });
             
         function remove() {
            d3.selectAll("li")
            .data([10, 20, 30, 15])
            .exit()
            .remove()
         }
      </script>
   </body>
</html>

O resultado do código acima será o seguinte -