누군가 D3.js에서 datum ()과 data ()의 차이점을 설명해 주시겠습니까? 둘 다 사용되는 것을보고 왜 다른 것을 선택해야하는지 잘 모르겠습니다.
답변
나는 Mike 자신에게서 올바른 대답을 찾았습니다.
데이터를 단일 SVG 요소에 바인딩하려면 다음을 사용하십시오.
(...).data([data])
또는
(...).datum(data)
데이터를 여러 SVG 요소에 바인딩하려는 경우
(...).data(data).enter().append("svg")
…..
답변
이 비트에보고 한 후, 나는 그들이에만 호출 경우 다루 여기에 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 문서로 시작하고 콘솔을 열고 문서에 몇 가지 요소를 추가하려고 한 후 사용하여 데이터를 바인딩을 시작하는 것입니다 selection.data
및 selection.datum
. 때때로, 읽는 것보다 무언가를 “탐색”하는 것이 훨씬 쉽습니다.
답변
다음은 좋은 링크입니다.
-
D3 “data ()”에 대한 좋은 토론 :
D3.js가 데이터를 노드에 바인딩하는 방법 이해
후자에 따라 :
# selection.data([values[, key]])
지정된 데이터 배열을 현재 선택 항목과 결합합니다. 지정된 값은 숫자 또는 객체의 배열과 같은 데이터 값의 배열이거나 값의 배열을 반환하는 함수입니다.
…
# selection.datum([value])
선택한 각 요소에 대한 바운드 데이터를 가져 오거나 설정합니다. selection.data 메소드와 달리이 메소드는 조인을 계산하지 않으므로 입력 및 종료 선택을 계산하지 않습니다.
답변
나는 HamsterHuey의 설명이 지금까지 최고라고 생각합니다. 그것에 확장 I 사이의 차이 중 적어도 일부 도시 한 샘플 문서 작성의 차이를 시각적으로 제공하는 방법 data
및이 datum
.
아래 답변은 이러한 방법을 사용하여 얻은 의견에 더 가깝지만 잘못하면 기꺼이 정정 할 수 있습니다.
이 예제는 아래 또는 이 Fiddle에서 실행할 수 있습니다 .
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>