Arrays - zziuni/d3 GitHub Wiki

Wiki β–Έ API Reference β–Έ Core β–Έ Arrays

D3λ₯Ό 데이터λ₯Ό μ‹œκ°ν™” ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•  λ•Œ, 일반적으둜 λ°°μ—΄ μ‘°μž‘ 을 많이 ν•˜κ²Œ λœλ‹€. 이건 D3의 곡식적인 데이터 ν‘œν˜„μ΄ 배열이기 λ•Œλ¬Έμ΄λ‹€. λ°°μ—΄ μ‘°μž‘μ€ 일반적으둜 λ°°μ—΄μ—μ„œ μΈμ ‘ν•œ 쑰각을 λΆ€λΆ„μ§‘ν•©μœΌλ‘œ 취득, μ„œμˆ  ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ 배열을 필터링, λ³€ν™˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ 배열을 동일 선상 κ°’λ“€κ³Ό 맀핑과 같은 μž‘μ—…μ„ ν¬ν•¨ν•œλ‹€. D3κ°€ λ°°μ—΄ μž‘μ—…μ„ μœ„ν•΄ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹°λ“€μ„ 보기전에 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄ κ΄€λ ¨ 빌트인 λ©”μ„œλ“œμ— λ¨Όμ € μ΅μˆ™ν•΄μ Έμ•Ό ν•œλ‹€.

λ‹€μŒμ€ 배열을 λ³€κ²½ν•˜λŠ” **mutator method(setter)**듀이닀.

  • array.reverse - λ°°μ—΄ μ›μ†Œμ˜ μˆœμ„œλ₯Ό μ—­μˆœμœΌλ‘œ λ°”κΎΌλ‹€.
  • array.shift - λ°°μ—΄μ˜ 첫 μ›μ†Œλ₯Ό μ œκ±°ν•œλ‹€.
  • array.sort - λ°°μ—΄ μ›μ†Œλ₯Ό μ •λ ¬ν•œλ‹€.
  • array.splice - 배열에 μ›μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•œλ‹€.
  • array.unshift - λ°°μ—΄μ˜ μ•žμͺ½μ— ν•˜λ‚˜ μ΄μƒμ˜ μ›μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€.

λ‹€μŒμ€ λ°°μ—΄μ˜ ν•œ ν˜•νƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” **accessor method(getter)**이닀.

  • array.concat - 배열을 λ‹€λ₯Έ λ°°μ—΄μ΄λ‚˜ κ°’κ³Ό ν•©μΉœλ‹€.
  • array.join - λ°°μ—΄μ˜ λͺ¨λ“  μ›μ†Œλ₯Ό λ¬Έμžμ—΄λ‘œ ν•©μΉœλ‹€.
  • array.slice - λ°°μ—΄μ˜ 일뢀λ₯Ό μΆ”μΆœν•œλ‹€.
  • array.indexOf - λ°°μ—΄μ—μ„œ μ°ΎλŠ” κ°’μ˜ 첫 μœ„μΉ˜λ₯Ό μ°ΎλŠ”λ‹€.
  • array.lastIndexOf - λ°°μ—΄μ—μ„œ μ°ΎλŠ” κ°’μ˜ λ§ˆμ§€λ§‰ μœ„μΉ˜λ₯Ό μ°ΎλŠ”λ‹€.

끝으둜, λ°°μ—΄μ˜ μ›μ†Œλ³„λ‘œ ν•¨μˆ˜λ₯Ό μ μš©ν•˜λŠ” iteration methodλ‹€.

  • array.filter - 콜백 ν•¨μˆ˜κ°€ true에 ν•΄λ‹Ήν•˜λŠ” μ›μ†Œλ§Œ μ‹ κ·œ λ°°μ—΄λ‘œ μƒμ„±ν•œλ‹€.
  • array.forEach - λ°°μ—΄μ˜ 각 μ›μ†Œλ³„λ‘œ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.
  • array.every - λ°°μ—΄μ˜ λͺ¨λ“  μ›μ†Œκ°€ 콜백 ν•¨μˆ˜μ— ν•©λ‹Ήν•œμ§€λ₯Ό κ²€μ‚¬ν•œλ‹€.
  • array.map - λ°°μ—΄μ˜ λͺ¨λ“  μ›μ†Œμ— 콜백 ν•¨μˆ˜λ₯Ό μ μš©ν•œ 결과둜 μ‹ κ·œ 배열을 μƒμ„±ν•œλ‹€.
  • array.some - λ°°μ—΄μ˜ μ›μ†Œμ€‘μ— ν•˜λ‚˜λΌλ„ 콜백 ν•¨μˆ˜μ— ν•©λ‹Ήν•œμ§€λ₯Ό κ²€μ‚¬ν•œλ‹€.
  • array.reduce - 배열을 μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 값을 ν•˜λ‚˜μ”© μ€„μ—¬κ°€λ©΄μ„œ 콜백 ν•¨μˆ˜λ₯Ό μ μš©ν•œλ‹€.
  • array.reduceRight - λ°°μ—΄μ˜ 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ 값을 ν•˜λ‚˜μ”© μ€„μ—¬κ°€λ©΄μ„œ 콜백 ν•¨μˆ˜λ₯Ό μ μš©ν•œλ‹€.

Ordering

# d3.ascending(a, b)

a κ°€ b 보닀 μž‘μœΌλ©΄ -1, a κ°€ b 보닀 크면 1, κ°™μœΌλ©΄ 0을 λ°˜ν™˜ν•œλ‹€. 이 ν•¨μˆ˜λŠ” natural order μœ„ν•œ 비ꡐ ν•¨μˆ˜λ‹€. μ˜€λ¦„μ°¨μˆœ μ •λ ¬λ‘œ μ›μ†Œλ₯Ό λ‚˜μ—΄ν•˜κΈ° μœ„ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 빌트-인 λ°°μ—΄ λ©”μ„œλ“œμΈ sort와 μ‘°ν•©ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

function(a, b) {
  return a < b ? -1 : a > b ? 1 : 0;
}

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” 빌트-인 sort λ©”μ„œλ“œμ— 지정할 비ꡐ ν•¨μˆ˜κ°€ μ—†λ‹€. sort λ©”μ„œλ“œμ˜ κΈ°λ³Έ 정렬은 natural이 μ•„λ‹Œ lexicographic(alphabetical) 정렬이고 숫자 배열을 μ •λ ¬ ν•  λ•Œλ„ 였λ₯˜λ₯Ό μœ λ°œν•  수 μžˆλ‹€.

lexicographic orderλŠ” μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ ν•œ κΈ€μžμ”© λΉ„κ΅ν•˜λ©° μ•ŒνŒŒλ²³ 순으둜 μ •λ ¬ν•˜λŠ” 방식을 μ˜λ―Έν•œλ‹€. κ·Έλž˜μ„œ ["1", "10", "2", "3", ] 처럼 μ •λ ¬λœλ‹€.

# d3.descending(a, b)

a κ°€ b 보닀 크면 -1, a κ°€ b 보닀 μž‘μœΌλ©΄ 1, κ°™μœΌλ©΄ 0을 λ°˜ν™˜ν•œλ‹€. 이 ν•¨μˆ˜λŠ” reverse natural 정렬을 μœ„ν•œ 비ꡐ ν•¨μˆ˜λ‹€. λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬λ‘œ μ›μ†Œλ₯Ό λ‚˜μ—΄ν•˜κΈ° μœ„ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 빌트인 λ°°μ—΄ λ©”μ„œλ“œμΈ sort와 μ‘°ν•©ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

function(a, b) {
  return b < a ? -1 : b > a ? 1 : 0;
}

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” 빌트 인 sort λ©”μ„œλ“œμ— 지정할 비ꡐ ν•¨μˆ˜κ°€ μ—†λ‹€. sort λ©”μ„œλ“œμ˜ κΈ°λ³Έ 정렬은 natural이 μ•„λ‹Œ lexicographic(alphabetical) 정렬이고 숫자 배열을 μ •λ ¬ ν•  λ•Œλ„ 였λ₯˜λ₯Ό μœ λ°œν•  수 μžˆλ‹€.

# d3.min(array[, accessor])

μ „λ‹¬μΈμž array μ—μ„œ natural μ •λ ¬ κΈ°μ€€μœΌλ‘œ μ΅œμ†Œκ°’μ„ λ°˜ν™˜ν•œλ‹€. 배열이 λΉ„μ—ˆμœΌλ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. μ΅œμ†Œκ°’ 계산전에 array.map(accessor) 처럼 μ μš©ν•˜κ³  μ‹ΆμœΌλ©΄ accessor ν•¨μˆ˜λ₯Ό μ˜΅μ…˜μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 이 λ©”μ„œλ“œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 빌트-인 λ©”μ„œλ“œ Math.minμ™€λŠ” 달리 undefined κ°’λ₯Ό λ¬΄μ‹œν•œλ‹€. 이 λ©”μ„œλ“œλŠ” λ°μ΄ν„°μ˜ λ²”μœ„λ₯Ό κ³ λ €ν•˜λ©΄μ„œ scale의 μž…λ ₯ λ²”μœ„λ₯Ό κ³„μ‚°ν•˜λŠ”λ° μœ μš©ν•˜λ‹€. 그리고 λ°°μ—΄ μ›μ†ŒλŠ” numeric 정렬이 μ•„λ‹ˆλΌ natural 정렬을 μ‚¬μš©ν•΄ λΉ„κ΅λœλ‹€. 예λ₯Ό λ“€μ–΄, ["20", "3"]의 μ΅œμ†Œκ°’μ€ "20"이고 [20, 3]의 μ΅œμ†Œκ°’μ€ 3이닀.

# d3.max(array[, accessor])

μ „λ‹¬μΈμž array μ—μ„œ natural μ •λ ¬ κΈ°μ€€μœΌλ‘œ μ΅œλŒ€κ°’μ„ λ°˜ν™˜ν•œλ‹€. 배열이 λΉ„μ–΄μžˆμœΌλ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. μ΅œλŒ€κ°’ 계산전에 array.map(accessor) 처럼 μ μš©ν•˜κ³  μ‹ΆμœΌλ©΄ accessor ν•¨μˆ˜λ₯Ό μ˜΅μ…˜μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 이 λ©”μ„œλ“œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 빌트-인 λ©”μ„œλ“œ Math.maxμ™€λŠ” 달리 undefined κ°’λ₯Ό λ¬΄μ‹œν•œλ‹€. 이 λ©”μ„œλ“œλŠ” λ°μ΄ν„°μ˜ λ²”μœ„λ₯Ό κ³ λ €ν•˜λ©΄μ„œ scale의 μž…λ ₯ λ²”μœ„λ₯Ό κ³„μ‚°ν•˜λŠ”λ° μœ μš©ν•˜λ‹€. 그리고 λ°°μ—΄ μ›μ†ŒλŠ” numeric 정렬이 μ•„λ‹ˆλΌ natural 정렬을 μ‚¬μš©ν•΄ λΉ„κ΅λœλ‹€. 예λ₯Ό λ“€μ–΄, ["20", "3"]의 μ΅œλŒ€κ°’μ€ "3"이고 [20, 3]의 μ΅œλŒ€κ°’μ€ 20이닀.

# d3.extent(array[, accessor])

μ „λ‹¬μΈμž array 배열을 natural 정렬을 μ‚¬μš©ν•΄μ„œ μ΅œλŒ€, μ΅œμ†Œκ°’μ„ λ°˜ν™˜ν•œλ‹€. 이 λ©”μ„œλ“œλŠ” d3.minκ³Ό d3.maxλ₯Ό λ™μ‹œμ— ν˜ΈμΆœν•œ 것과 κ°™λ‹€.

# d3.sum(array[, accessor])

μ „λ‹¬μΈμž array λ°°μ—΄ μ›μ†Œμ˜ 합을 λ°˜ν™˜ν•œλ‹€. 배열이 λΉ„μ˜€μœΌλ©΄ 0을 λ°˜ν™˜ν•œλ‹€. 합을 κ³„μ‚°ν•˜κΈ°μ „μ— arrary.map(accessor) 처럼 μ μš©ν•˜κ³  μ‹ΆμœΌλ©΄ accessor ν•¨μˆ˜λ₯Ό μ˜΅μ…˜μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 이 λ©”μ„œλ“œλŠ” NaNκ³Ό undefined 같은 μœ νš¨ν•˜μ§€ μ•Šμ€ 값은 λ¬΄μ‹œν•œλ‹€. κ·Έλž˜μ„œ μœ νš¨ν•œ κ°’λ§ŒμœΌλ‘œ 데이터λ₯Ό ν•©μ‚°ν•˜λŠ” 계산에 μœ μš©ν•˜λ‹€.

# d3.mean(array[, accessor])

μ „λ‹¬μΈμž array μ›μ†Œλ“€μ˜ 평균을 λ°˜ν™˜ν•œλ‹€. 배열이 λΉ„μ˜€μœΌλ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. 평균을 κ³„μ‚°ν•˜κΈ° 전에 array.map(accessor) 처럼 μ μš©ν•˜κ³  μ‹ΆμœΌλ©΄ accessor ν•¨μˆ˜λ₯Ό μ˜΅μ…˜μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 이 λ©”μ„œλ“œλŠ” NaNκ³Ό undefined 같은 μœ νš¨ν•˜μ§€ μ•Šμ€ 값은 λ¬΄μ‹œν•œλ‹€. κ·Έλž˜μ„œ μœ νš¨ν•œ κ°’λ§ŒμœΌλ‘œ 데이터λ₯Ό ν‰κ· λ‚΄λŠ” 계산에 μœ μš©ν•˜λ‹€.

# d3.median(array[, accessor])

R-7μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ„œ μ „λ‹¬μΈμž array λ°°μ—΄μ˜ μ›μ†Œλ“€μ˜ 쀑앙값을 λ°˜ν™˜ν•œλ‹€. 배열이 λΉ„μ–΄μžˆμœΌλ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. 쀑앙값을 κ³„μ‚°ν•˜κΈ°μ „μ— array.map(accessor) 처럼 μ μš©ν•˜κ³  μ‹ΆμœΌλ©΄ accessor ν•¨μˆ˜λ₯Ό μ˜΅μ…˜μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 이 λ©”μ„œλ“œλŠ” NaNκ³Ό undefined 같은 μœ νš¨ν•˜μ§€ μ•Šμ€ 값은 λ¬΄μ‹œν•œλ‹€. κ·Έλž˜μ„œ μœ νš¨ν•œ κ°’λ§ŒμœΌλ‘œ 데이터 쀑앙값을 계산에 μœ μš©ν•˜λ‹€.

# d3.quantile(numbers, p)

μ „λ‹¬μΈμž numbers 배열을 μ •λ ¬ν•΄μ„œ p-quantileλ₯Ό λ°˜ν™˜ν•œλ‹€. μ „λ‹¬μΈμž p λŠ” [0,1] μ‚¬μ΄μ˜ μˆ«μžμ΄λ‹€. 예λ₯Ό λ“€μ–΄ 쀑앙값은 p = 0.5λ₯Ό μ‚¬μš©ν•˜λ©΄ 계산할 수 μžˆλ‹€. p = 0.25이면 1/4 지점 값은, p = 0.75이면 3/4 지점 값이닀. 이런 λ…νŠΉν•œ κ΅¬ν˜„μ€ R ν”„λ‘œκ·Έλž˜λ°κ³Ό μ•‘μ…€μ˜ 기반인 R-7 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€. 이 λ©”μ„œλ“œλŠ” 인자인 numbers λŠ” μ›μ†Œκ°€ μˆ«μžν˜•μ΄μ—¬μ•Ό ν•˜κ³  d3.ascending같은 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 사전에 정렬이 λ˜μ–΄μžˆμ–΄μ•Ό ν•œλ‹€.

# d3.bisectLeft(array, x[, lo[, hi]])

μ „λ‹¬μΈμž array λ°°μ—΄μ—μ„œ κ·Έ μ •λ ¬ μˆœμ„œν•˜μ˜ x 의 μ‚½μž…μœ„μΉ˜. lo 와 hi λŠ” μ‚¬μš©λ  κΈ°λ³Έ 전체 λ°°μ—΄λ‘œ κ²°μ •λ˜μ•Ό ν•˜λŠ” λ°°μ—΄μ˜ ν•˜μœ„μ§‘ν•©μ„ μ§€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. x κ°€ 이미 array μ•ˆμ— μžˆλ‹€λ©΄, μ‚½μž… μœ„μΉ˜λŠ” 이미 μ‘΄μž¬ν•˜λŠ” μ›μ†Œμ˜ μ•žμ΄ λœλ‹€. (μ™Όμͺ½μ— 해당함.) λ°˜ν™˜ 값이 array κ°€ 이미 μ •λ ¬λ˜μ–΄μžˆλ‹€λŠ” κ°€μ •ν•˜μ— splice의 첫 번째 μ „λ‹¬μΈμžλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. μ™Όμͺ½μ€ array.slice(lo, i)의 v κ°€ λͺ¨λ‘ v < x 이고 였λ₯Έμͺ½μ€ array.slice(i, hi)의 v κ°€ λͺ¨λ‘ v >= x 이도둝 λ°˜ν•œλœ μ‚½μž… 지점 iκ°€ array λ₯Ό λ‘˜λ‘œ λ‚˜λˆˆλ‹€.

# d3.bisect(array, x[, lo[, hi]])
# d3.bisectRight(array, x[, lo[, hi]])

bisectLeft와 λΉ„μŠ·ν•˜μ§€λ§Œ array 에 이미 μ‘΄μž¬ν•˜λŠ” x 의 였λ₯Έμͺ½ 지점을 μ‚½μž… μ§€μ μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. μ™Όμͺ½μ€ array.slice(lo, i)의 v κ°€ λͺ¨λ‘ v <= x 이고 였λ₯Έμͺ½μ€ array.slice(i, hi)의 v κ°€ λͺ¨λ‘ v > x 이도둝 λ°˜ν•œλœ μ‚½μž… 지점 iκ°€ array λ₯Ό λ‘˜λ‘œ λ‚˜λˆˆλ‹€.

# d3.bisector(accessor)

μ „λ‹¬μΈμž accessor ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 이등뢄 객체을 λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ κ°μ²΄μ—λŠ” bisectLeft와 bisectRight와 μœ μ‚¬ν•œ left, right ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€. 이 λ©”μ„œλ“œλŠ” λ‹¨μˆœν•œ μ›μ†Œ 배열이 μ•„λ‹Œ 객체 λ°°μ—΄ 뢄할에 μ‚¬μš©ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒκ°™μ€ 객체 배열이 μžˆλ‹€λ©΄,

var data = [
  {date: new Date(2011,  1, 1), value: 0.5},
  {date: new Date(2011,  2, 1), value: 0.6},
  {date: new Date(2011,  3, 1), value: 0.7},
  {date: new Date(2011,  4, 1), value: 0.8}
];

μ μ ˆν•œ λΆ„ν•  ν•¨μˆ˜λ₯Ό μƒμ„±ν•œλ‹€.

var bisect = d3.bisector(function(d) { return d.date; }).right;

κ·Έλ¦¬κ³ λ‚˜μ„œ bisect(data, new Date(2011, 1, 2))λ₯Ό μ μš©ν•΄μ„œ 색인을 μ–»λŠ”λ‹€.

# d3.shuffle(array)

Fisher–Yates shuffleλ₯Ό μ‚¬μš©ν•΄μ„œ μ „λ‹¬μΈμž array 의 μˆœμ„œλ₯Ό λžœλ€ν•˜κ²Œ λ§Œλ“ λ‹€.

# d3.first(array[, comparator])

Returns the lowest element in the specified array, as ordered by the specified comparator. If no comparator is specified, d3.ascending is used. This method is similar to d3.min, except you can use an arbitrary comparator, rather than mapping array elements to a numeric value.

# d3.last(array[, comparator])

Returns the highest element in the specified array, as ordered by the specified comparator. If no comparator is specified, d3.ascending is used. This method is similar to d3.max, except you can use an arbitrary comparator, rather than mapping array elements to a numeric value.

Associative Arrays

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” λ°°μ—΄ 말고도 λ²”μš© 데이터 νƒ€μž…μœΌλ‘œ μ—°κ΄€ 배열이 μžˆλ‹€. μ—°κ΄€ λ°°μ—΄μ—λŠ” λͺ…λͺ…λœ ν”„λ‘œνΌν‹°λ“€μ΄ 있고 κ°„ν˜Ή 더 λ‹¨μˆœν•œ 객체일 λ•Œλ„ μžˆλ‹€. 이 νƒ€μž…μ€ μžλ°”μ—μ„œλŠ” map, νŒŒμ΄μ¬μ—μ„œλŠ” dictionary에 ν•΄λ‹Ήν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 연관배열은 ν‚€(λ˜λŠ” ν”„λ‘œνΌν‹° λͺ…)둜 μˆœν™˜ν•˜κΈ° μœ„ν•œ ν‘œμ€€ λ©”μΉ΄λ‹ˆμ¦˜μœΌλ‘œ for…in loop을 μ§€μ›ν•˜μ§€λ§Œ 정렬을 ν•  수 μ—†μœΌλ―€λ‘œ 정렬을 ν•  수 μžˆλ„λ‘ D3κ°€ μ—°κ΄€ 배열을 ν‘œμ€€ 색인 λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λŠ” λͺ‡κ°€μ§€ μ—°μ‚°μžλ₯Ό μ œκ³΅ν•œλ‹€.

# d3.keys(object)

μ „λ‹¬μΈμžλ‘œ λ„˜μ–΄μ˜¨ 객체(μ—°κ΄€ λ°°μ—΄)의 ν”„λ‘œνΌν‹° λͺ…을 가진 배열을 λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ 배열은 μ •λ ¬λ˜μ§€ μ•Šμ€ μƒνƒœλ‹€.

# d3.values(object)

μ „λ‹¬μΈμžλ‘œ λ„˜μ–΄μ˜¨ 객체(μ—°κ΄€ λ°°μ—΄)의 ν”„λ‘œνΌν‹° 값을 가진 배열을 λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ 배열은 μ •λ ¬λ˜μ§€ μ•Šμ€ μƒνƒœλ‹€.

# d3.entries(object)

μ „λ‹¬μΈμžλ‘œ λ„˜μ–΄μ˜¨ 객체(μ—°κ΄€ λ°°μ—΄)의 ν”„λ‘œνΌν‹° λͺ…κ³Ό 값을 가진 배열을 λ°˜ν™˜ν•œλ‹€. 각 λ°°μ—΄ μ›μ†ŒλŠ” {key: "foo", value: 42}처럼 key와 value 속성을 가진 객체닀. λ°˜ν™˜ 배열은 μ •λ ¬λ˜μ§€ μ•Šμ€ μƒνƒœλ‹€.

Maps

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 일반 객체λ₯Ό map으둜 μ‚¬μš©ν•˜κ³ μž ν•˜λ©΄, λ‚΄μž₯ ν”„λ‘œνΌν‹° λͺ…이 ν‚€λ‘œ μ‚¬μš©λ  λ•Œ μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘(unexpected behavior)이 일어날 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ object["__proto__"] = 42라고 지정할 경우 μ—¬λŸ¬λΆ„μ΄ κΈ°λŒ€ν•˜λŠ” λ™μž‘μ€ μΌμ–΄λ‚˜μ§€ μ•ŠμœΌλ©°, ν‚€κ°€ 맡 μ•ˆμ— μ •μ˜λ˜μ—ˆλŠ”μ§€λ₯Ό μ•Œμ•„λ³΄κΈ° μœ„ν•΄ 쑰회λ₯Ό μ‹œλ„ν•  λ•Œλ„ λ§ˆμ°¬κ°€μ§€λ‹€. 즉, 일반 κ°μ²΄λŠ” Object prototypeμ—μ„œ hasOwnProperty λ©”μ„œλ“œλ₯Ό μƒμ†ν•˜κΈ° λ•Œλ¬Έμ— "hasOwnProperty" in objectλŠ” trueλ₯Ό λ°˜ν™˜ν•œλ‹€. 이런 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄μ„œ ES6은 simple maps and setsλ₯Ό μ œμ•ˆν•œ μƒνƒœμ΄λ©° μ£Όλ₯˜ λΈŒλΌμš°μ €λ“€μ΄ 이 μ½œλž™μ…˜λ“€μ„ 지원할 λ•Œ κΉŒμ§€λŠ” d3.map을 μ‚¬μš©ν•˜λŠ”κ²Œ μ’‹λ‹€.

주의: ES6이 μ œμ•ˆν•œ mapκ³ΌλŠ” 달리, d3.map은 아직 keyλ₯Ό μœ„ν•΄μ„œ ν•­λ“± 비ꡐ(===, !==)λŒ€μ‹ μ— λ¬Έμžμ—΄λ‘œ κ°•μ œ λ³€ν™˜ν•˜λŠ” 일반 비ꡐ(==, !=)λ₯Ό μ‚¬μš©ν•œλ‹€.

# d3.map([object])

μ‹ κ·œ 맡을 μƒμ„±ν•œλ‹€. object μ „λ‹¬μΈμžλ₯Ό λ„˜κΈ°λ©΄ object 의 λͺ¨λ“  μ—΄κ±°ν˜• ν”„λ‘œνΌν‹°λ₯Ό 맡으둜 λ³΅μ‚¬ν•œλ‹€.

# map.has(key)

μ „λ‹¬μΈμž key 에 ν•΄λ‹Ήν•˜λŠ” μ›μ†Œκ°€ 맡에 있으면 trueλ₯Ό λ°˜ν™˜ν•œλ‹€. key에 ν•΄λ‹Ήν•˜λŠ” 값이 μžˆμœΌλ‚˜ nullμ΄κ±°λ‚˜ undefined일 μˆ˜λŠ” μžˆλ‹€.

# map.get(key)

μ „λ‹¬μΈμž key 에 ν•΄λ‹Ήν•˜λŠ” 값을 λ°˜ν™˜ν•œλ‹€. key에 ν•΄λ‹Ήν•˜λŠ” μ›μ†Œκ°€ 맡에 μ—†μœΌλ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

# map.set(key, value)

μ „λ‹¬μΈμž key 에 value λ₯Ό μ§€μ •ν•˜κ³  κ·Έ value λ₯Ό λ°˜ν™˜ν•œλ‹€. 맡에 이미 동λͺ…μ˜ μ›μ†Œκ°€ 있으면, μƒˆλ‘œμš΄ κ°’μœΌλ‘œ λŒ€μ²΄ λœλ‹€.

# map.remove(key)

맡에 μ „λ‹¬μΈμž key 에 ν•΄λ‹Ήν•˜λŠ” μ›μ†Œκ°€ 있으면 μ œκ±°ν•˜κ³  trueλ₯Ό λ°˜ν™˜ν•œλ‹€. μ—†μœΌλ©΄ 아무일도 ν•˜μ§€ μ•Šκ³  falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

# map.keys()

맡의 λͺ¨λ“  μ›μ†Œμ˜ keyλ₯Ό λ¬Έμžμ—΄ λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ key의 μˆœμ„œλŠ” μž„μ˜λ‘œ κ²°μ •λœλ‹€.

# map.values()

맡의 λͺ¨λ“  μ›μ†Œμ˜ 값을 λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ κ°’μ˜ μˆœμ„œλŠ” μž„μ˜λ‘œ κ²°μ •λœλ‹€.

# map.entries()

맡의 λͺ¨λ“  μ›μ†Œμ˜ ν‚€-κ°’ 객체λ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ μ›μ†Œλ“€μ˜ μˆœμ„œλŠ” μž„μ˜λ‘œ κ²°μ •λœλ‹€.

# map.forEach(function)

맡의 각 μ›μ†Œλ³„λ‘œ function λ₯Ό ν˜ΈμΆœν•œλ‹€. 이 ν•¨μˆ˜λŠ” μ›μ†Œμ˜ key와 valueλ₯Ό μ „λ‹¬μΈμžλ‘œ κ°–λŠ”λ‹€. function 의 this μ»¨ν…μŠ€νŠΈλŠ” ν•΄λ‹Ή 맡이닀. λ°˜ν™˜κ°’μ€ undefined이며 순회 μˆœμ„œλŠ” μž„μ˜λ‘œ κ²°μ •λœλ‹€.

Array Operators

# d3.split(array[, function])

Splits the specified array into multiple arrays at breakpoints identified by the specified function. If no breakpoint function is specified, the array will be split at any null or undefined values, equivalent to the following function:

function breakpoint(d) {
  return d == null;
}

Elements that are identified as breakpoints, as by the function returning a truthy value, will not be included in the returned arrays. (In the future, a more general API might use a breakpoint function that takes two arguments and decides whether to split them, and also gives some indication as to whether to include those two values in the split arrays…)

This method is often used in conjunction with the line shape, such that missing data points are elided; each contiguous slice of the array where the data is defined is rendered as a line segment.

# d3.merge(arrays)

μ „λ‹¬μΈμž arrays λ₯Ό ν•˜λ‚˜μ˜ λ°°μ—΄λ‘œ 합쳐쀀닀. 이 λ©”μ„œλ“œλŠ” λ°°μ—΄ 빌트-인 λ©”μ„œλ“œ concatκ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ λ°°μ—΄μ•ˆμ— 배열이 μžˆλŠ” ν˜•νƒœμ—μ„œ 더 μœ μš©ν•˜λ‹€λŠ” 차이점이 μžˆλ‹€.

# d3.range([start, ]stop[, step])

λ“±μ°¨μˆ˜μ—΄μ„ 담은 배열을 μƒμ„±ν•œλ‹€. 파이썬의 빌트-인 λ©”μ„œλ“œ range와 λΉ„μŠ·ν•˜λ‹€. 이 λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ 색인 같은 μ •μˆ˜ κ°’λ“€μ΄λ‚˜ μˆ˜μ—΄μ„ μˆœνšŒν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•œλ‹€. 파이썬 rangeμ™€λŠ” 달리, λΆ€λ™μ†Œμˆ˜μ  μ •λ°€λ„λ‘œ μΈν•΄μ„œ κ²°κ³Όκ°€ 더 μ˜ˆμƒ κ°€λŠ₯ν•˜μ§€λ§Œ μ „λ‹¬μΈμžκ°€ κΌ­ μ •μˆ˜μΌ ν•„μš”λŠ” μ—†λ‹€. step 을 μƒλž΅ν•˜λ©΄ 기본값은 1이고, start λ₯Ό μƒλž΅ν•˜λ©΄ 기본값이 0이닀. stop 값은 결과에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€. 결과의 전체 ν˜•νƒœλŠ” [ start , start + step, start + 2 * step , …]의 숫자 λ°°μ—΄λ‘œ λ°˜ν™˜λœλ‹€. step 이 μ–‘μˆ˜λ©΄ λ§ˆμ§€λ§‰ μ›μ†ŒλŠ” stop 보닀 start + i * step 만큼 크닀. step 이 음수면 λ§ˆμ§€λ§‰ μ›μ†ŒλŠ” stop 보닀 start + i * step 만큼 μž‘λ‹€. λ°˜ν™˜ λ°°μ—΄μ˜ 값이 λ¬΄ν•œκ°’μœΌ 되면 λ¬΄ν•œλ£¨ν”„λ₯Ό λŒμ§€ μ•Šκ³  μ—λŸ¬λ₯Ό λ˜μ§„λ‹€.

# d3.permute(array, indexes)

indexs 배열을 μ‚¬μš©ν•΄μ„œ array 의 μˆœμ—΄(permutation)을 λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ 배열은 indexs λ°°μ—΄μ˜ 각 색인에 λŒ€ν•œ ν•΄λ‹Ή μ›μ†Œλ₯Ό μˆœμ„œλŒ€λ‘œ λ‹΄κ³  μžˆλ‹€. 예λ₯Ό λ“€μ–΄, permute(["a", "b", "c"], [1, 2, 0])λŠ” ["b", "c", "a"]λ₯Ό λ°˜ν™˜ν•œλ‹€. 색인 λ°°μ—΄ indexsλŠ” μ›μ†Œ 배열인 array 와 길이가 λ‹€λ₯Ό 수 있으며 μ€‘λ³΅λ˜κ±°λ‚˜ μƒλž΅ κ°€λŠ₯ν•˜λ‹€.

이 λ©”μ„œλ“œλŠ” μ •λ ¬ μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©΄μ„œ λ°°μ—΄μ˜ κ°μ²΄μ—μ„œ 값을 μΆ”μΆœν•˜λŠ”λ°λ„ μ‚¬μš©ν•  수 μžˆλ‹€. (μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°°μ—΄ 색인값은 .lengthκ³Ό νŠΉλ³„ν•œ 관계λ₯Ό 맺은 ν”„λ‘œνΌν‹°μΌ 뿐이닀.) 쀑첩 μ„ νƒλ¬Όμ—μ„œ data 배열을 μƒμ„±ν•˜λ € ν•  λ•Œ μ •λ ¬μˆœμ„œλŒ€λ‘œ λͺ…λͺ…λœ 값을 μΆ”μΆœν•˜λŠ” κΈ°λŠ₯이 μœ μš©ν•˜λ‹€. 예λ₯Ό λ“€μ–΄ ν…Œμ΄λΈ” ν˜•νƒœλ‘œ 사전에 Minnesota barley yield 데이터쀑 일뢀λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€.

var cols = ["site", "variety", "yield"];
thead.selectAll('th').data(cols)
    .enter().append('th').text(function (d) { return d.toUpperCase(); });
tbody.selectAll('tr').data(yields)
    .enter().append('tr').selectAll('td').data(function (row) { return d3.permute(row, cols); })
        .enter().append('td').text(function (d) { return d; });

# d3.zip(arrays…)

λ°°μ—΄μ˜ 배열을 λ°˜ν™˜ν•˜λŠ”λ°, i번째 배열은 μ „λ‹¬μΈμž arrays κ°κ°μ—μ„œ i번째 μ›μ†Œμ„ λ‹΄κ³  μžˆλ‹€. λ°˜ν™˜ 배열은 arrays 쀑 κ°€μž₯ 짧은 λ°°μ—΄μ˜ 길이둜 μž¬λ‹¨λœλ‹€. arrays 둜 배열이 ν•˜λ‚˜λ§Œ μ§€μ •λ˜λ©΄ λ°˜ν™˜ 배열은 μ›μ†Œκ°€ ν•˜λ‚˜μΈ 배열이 λœλ‹€. μ „λ‹¬μΈμžκ°€ μ—†μœΌλ©΄ λ°˜ν™˜ 배열을 빈 배열이닀.

# d3.transpose(matrix)

d3.zip.apply(null, matrix)와 λ™μΌν•˜λ‹€. 2차원 μ „μΉ˜ν–‰λ ¬(matrix transpose)λ₯Ό μœ„ν•΄μ„œ zip μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€.

Nest

λ°°μ—΄μ˜ μ›μ†ŒλŠ” 쀑첩(nestring)을 ν†΅ν•΄μ„œ 계측 트리ꡬ쑰둜 그룹지을 수 μžˆλ‹€. 쀑첩은 SQL의 GROUP BY μ—°μ‚°μžμ™€ μœ μ‚¬ν•˜μ§€λ§Œ 그룹핑이 μ—¬λŸ¬λ‹¨κ³„ κ°€λŠ₯ν•˜κ³  κ²°κ³Όκ°€ 단면 ν…Œμ΄λΈ”μ΄ μ•„λ‹Œ νŠΈλ¦¬κ΅¬μ‘°λΌλŠ” 점이 λ‹€λ₯΄λ‹€. 트리의 λ ˆλ²¨μ€ key ν•¨μˆ˜λ‘œ μ§€μ •ν•œλ‹€. 트리의 쀑간 단계 λ…Έλ“œλŠ” key둜 μ •λ ¬ν•  수 있고 리프(leaf) λ…Έλ“œλŠ” value으둜 μ •λ ¬ κ°€λŠ₯ν•˜λ‹€. μ˜΅μ…˜μΈ rollup ν•¨μˆ˜λŠ” ν•©μ‚° ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 리프 λ…Έλ“œλ³„λ‘œ μ›μ†Œλ“€μ„ μˆ¨κΈ΄λ‹€. nest μ—°μ‚°μž 객체(d3.nestκ°€ λ°˜ν™˜ν•œ 객체)λŠ” 재 μ‚¬μš©κ°€λŠ₯ν•˜μ§€λ§Œ μ€‘μ²©λœ 데이터 μ°Έμ‘°λ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€.

예λ₯Ό λ“€μ–΄, 1931~1932λ…„ 사이, Minnesotaμ£Ό μ—¬λŸ¬μ§€μ—­μ˜ 보리밭에 λŒ€ν•œ μ§‘κ³„μžλ£Œλ₯Ό 보자.

var yields = [{yield: 27.00, variety: "Manchuria", year: 1931, site: "University Farm"},
              {yield: 48.87, variety: "Manchuria", year: 1931, site: "Waseca"},
              {yield: 27.43, variety: "Manchuria", year: 1931, site: "Morris"}, ...]

μ‹œκ°ν™”λ₯Ό μ†μ‰½κ²Œ ν•˜λ €λ©΄ year, variety 순으둜 μ›μ†Œλ₯Ό μ€‘μ²©μ‹œν‚€λŠ”κ²Œ νŽΈν•˜λ‹€.

var nest = d3.nest()
    .key(function(d) { return d.year; })
    .key(function(d) { return d.variety; })
    .entries(yields);

λ‹€μŒμ΄ λ°˜ν™˜λœ 배열이닀. κ²°κ³Ό λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” 각 key에 ν•΄λ‹Ήν•˜λŠ” valuesλ₯Ό λ‚˜μ—΄ν•œ ν•œ 쌍의 key-values이닀.

[{key: 1931, values: [
   {key: "Manchuria", values: [
     {yield: 27.00, variety: "Manchuria", year: 1931, site: "University Farm"},
     {yield: 48.87, variety: "Manchuria", year: 1931, site: "Waseca"},
     {yield: 27.43, variety: "Manchuria", year: 1931, site: "Morris"}, ...]},
   {key: "Glabron", values: [
     {yield: 43.07, variety: "Glabron", year: 1931, site: "University Farm"},
     {yield: 55.20, variety: "Glabron", year: 1931, site: "Waseca"}, ...]}, ...]},
 {key: 1932, values: ...}]

이런 μ€‘μ²©λœ λͺ¨μ–‘은 SVGλ‚˜ HTMLμ—μ„œ 계측ꡬ쑰 생성과 순회λ₯Ό μ‰½κ²Œ ν•΄μ€€λ‹€.

# d3.nest()

μ‹ κ·œ nest μ—°μ‚°μžλ₯Ό μƒμ„±ν•œλ‹€. μƒμ„±μ‹œμ—λŠ” key 집합이 λΉ„μ–΄μžˆλ‹€. key ν•¨μˆ˜λ₯Ό λ“±λ‘μ•ˆν•˜κ³  mapλ‚˜ entries μ—°μ‚°μžλ₯Ό ν˜ΈμΆœν•˜λ©΄, nest μ—°μ‚°μžλŠ” κ·Έλƒ₯ κ·Έ μ—°μ‚°μžμ˜ μž…λ ₯ 배열을 λ°˜ν™˜ν•œλ‹€.

# nest.key(function)

μ‹ κ·œ key function 을 λ“±λ‘ν•œλ‹€. key ν•¨μˆ˜λŠ” μž…λ ₯ λ°°μ—΄μ˜ 각 μ›μ†Œλ³„λ‘œ 호좜되고 ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ μ›μ†Œλ₯Ό κ·Έλ£Ήν™” ν•˜λŠ”λ° μ‚¬μš©ν•  식별 λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. κ·Έλž˜μ„œ λŒ€λΆ€λΆ„, ν•¨μˆ˜λŠ” μ•žμ˜ μ˜ˆμ œμ—μ„œ yearκ³Ό variety μ ‘κ·Όμžμ²˜λŸΌ λ‹¨μˆœν•œ μ ‘κ·Όμžλ‘œ κ΅¬ν˜„λœλ‹€. keyλŠ” 등둝될 λ•Œ λ§ˆλ‹€ λ‚΄λΆ€μ˜ keys λ°°μ—΄μ˜ 끝에 ν‘Έμ‰¬λ˜κ³  mapμ΄λ‚˜ ν•­λͺ©μ˜ κ²°κ³Όλ¬Όμ—λŠ” μΆ”κ°€ 계측 단계가 생긴닀. λ“±λ‘λœ keyλ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ μ œκ±°ν•˜λŠ” κΈ°λŠ₯이 ν˜„μž¬λŠ” μ—†λ‹€. λ§ˆμ§€λ§‰ λ“±λ‘ν•œ keyλŠ” λ©”μ„œλ“œ μ²΄μ΄λ‹μ˜ λ‹€μŒ λ©”μ„œλ“œμ—μ„œ ν•΄λ‹Ή key둜 μ°Έμ‘°λœλ‹€.

# nest.sortKeys(comparator)

μ „λ‹¬μΈμž comparator(d3.descending 같은 λΉ„κ΅μž)λ₯Ό μ‚¬μš©ν•΄μ„œ ν•΄λ‹Ή keyμ—μ„œ 값을 μ •λ ¬ν•œλ‹€. ν•΄λ‹Ή keyλ₯Ό μœ„ν•œ λΉ„κ΅μžλ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ keyκ°€ λ°˜ν™˜λ  μœ„μΉ˜μ˜ 정렬은 undefinedκ°€ λœλ‹€. μ£Όμ˜ν•  점은 이 μ—°μ‚°μžλŠ” entries μ—°μ‚°μž κ²°κ³Όμ—λ§Œ 영ν–₯을 μ€€λ‹€. comparator μΈμžμ— 상관없이 map μ—°μ‚°μžκ°€ λ°˜ν™˜ν•œ key정렬은 항상 undefined이닀.

# nest.sortValues(comparator)

μ „λ‹¬μΈμž comparator μ—°μ‚°μž(d3.descending같은 λΉ„κ΅μž)λ₯Ό μ΄μš©ν•΄μ„œ 리프 μ›μ†Œλ₯Ό μ •λ ¬ν•œλ‹€. μ΄λŠ” nest μ—°μ‚°μžλ₯Ό μ μš©ν•˜κΈ°μ „μ— μž…λ ₯ 배열을 μ •λ ¬ν•˜λŠ” λ™μž‘κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ λ£Ήν•‘ν•œ 각 그룹의 크기가 μƒλŒ€μ μœΌλ‘œ μž‘μœΌλ―€λ‘œ μΌλ°˜μ μœΌλ‘œλŠ” 쒀더 νš¨κ³Όμ μ΄λ‹€. κ°’ 비ꡐλ₯Ό μœ„ν•œ comparator λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μ›μ†ŒλŠ” μž…λ ₯ λ°°μ—΄μ˜ μ •λ ¬ μˆœμ„œλ‘œ λ°˜ν™˜λœλ‹€. 이 μ—°μ‚°μžλŠ” map, entires μ—°μ‚°μž λͺ¨λ‘μ— μ μš©λœλ‹€.

# nest.rollup(function)

리프 μ›μ†Œ κ·Έλ£Ή λ³„λ‘œ μ μš©ν•  rollup function 을 μ œκ³΅ν•œλ‹€. 리프 κ°’λ“€μ˜ 배열이 rollup ν•¨μˆ˜μ˜ λ°˜ν™˜ κ°’μœΌλ‘œ ꡐ체 λ˜λŠ”λ°, map μ—°μ‚°μž λ°˜ν™˜κ°’μΈ μ—°κ΄€ λ°°μ—΄μ΄λ‚˜ entries μ—°μ‚°μžκ°€ λ°˜ν™˜ν•˜λŠ” 각 μ›μ†Œμ˜ values 속성이든 관계없닀.

# nest.map(array)

array 둜 nest μ—°μ‚°μžλ₯Ό μ μš©ν•˜λ©°, 연관배열을 λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜λœ μ—°κ΄€λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” 첫 keyν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λŠ” key 값에 λΆ€ν•©ν•œλ‹€. μ›μ†Œκ°’μ€ λ“±λ‘λœ key ν•¨μˆ˜μ˜ μˆ˜μ™€ κ΄€λ ¨μžˆλ‹€. keyν•¨μˆ˜κ°€ μ—¬λŸ¬κ°œλ©΄, μ›μ†Œκ°’μ€ μ€‘μ²©λœ λ‹€λ₯Έ μ—°κ΄€ 배열이닀. 그렇지 μ•ŠμœΌλ©΄ μ›μ†Œκ°’μ€ 첫번째 key ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ key κ°’μœΌλ‘œ μž…λ ₯ array 의 μ›μ†Œλ₯Ό ν•„ν„°λ§ν•œ 배열이닀.

# nest.entries(array)

array 둜 nest μ—°μ‚°μžλ₯Ό μ μš©ν•˜λ©°, key와 values μ›μ†Œλ₯Ό 가진 배열을 λ°˜ν™˜ν•œλ‹€. 이둠적으둠 mapκ°€ λ°˜ν™˜ν•˜λŠ” 연관배열에 d3.entriesλ₯Ό μ μš©ν•˜λŠ”κ²ƒκ³Ό μœ μ‚¬ν•˜μ§€λ§Œ 첫단계 만이 μ•„λ‹ˆλΌ 계측 단계λ₯Ό 타고 λͺ¨λ‘ μ μš©ν•œλ‹€λŠ” 점이 λ‹€λ₯΄λ‹€. λ°˜ν™˜ λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” 첫번째 key ν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λŠ” key 값에 λΆ€ν•©ν•œλ‹€. μ›μ†Œκ°’μ€ λ“±λ‘λœ key ν•¨μˆ˜μ˜ μˆ˜μ™€ 관련이 μžˆλ‹€. 즉, keyν•¨μˆ˜κ°€ μ—¬λŸ¬κ°œλ©΄, κ·Έ μ›μ†Œκ°’μ€ λ‹€μ‹œ λ³„λ„μ˜ 쀑첩 λ°°μ—΄μ΄μ§€λ§Œ, 그렇지 μ•ŠμœΌλ©΄ μ›μ†Œκ°’μ€ 첫번째 key ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ key κ°’μœΌλ‘œ μž…λ ₯ array 의 μ›μ†Œλ₯Ό ν•„ν„°λ§ν•œ 배열이닀.

⚠️ **GitHub.com Fallback** ⚠️