Array.from()으둜 μ—°μ†λœ 수둜 κ΅¬μ„±λœ λ°°μ—΄ [1, 2, 3, 4, 5] λ§Œλ“œλŠ” κ³Όμ • μ•Œμ•„λ³΄κΈ°

Array.from λ©”μ„œλ“œλŠ” μœ μ‚¬ λ°°μ—΄ 객체(array-like object)λ‚˜ 반볡 κ°€λŠ₯ν•œ 객체(iterable object)λ₯Ό μ–•κ²Œ 볡사해 μƒˆλ‘œμš΄ Array 객체λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

이 λ©”μ„œλ“œλŠ” μ΄λ¦„μ—μ„œλ„ μœ μΆ”ν•΄λ³Ό 수 μžˆλ‹€μ‹œν”Ό μ–΄λ–€ λ°μ΄ν„°λ‘œ λΆ€ν„° 배열을 μƒμ„±ν•©λ‹ˆλ‹€.
MDN에 λ‚˜μ™€μžˆλŠ” μ˜ˆμ‹œλ‘œ, λ¬Έμžμ—΄μ„ 문자 λ‹¨μœ„λ‘œ μͺΌκ°œμ–΄ λ°°μ—΄λ‘œ λ§Œλ“€κ±°λ‚˜, μ•„κ·œλ¨ΌνŠΈλ₯Ό λ°°μ—΄λ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

Array.from('foo')); // -> [β€˜f’, β€˜o’, β€˜o’]
function f() {
  return Array.from(arguments);
}
f(1, 2, 3); // -> [1, 2, 3]

그리고 νŠΉμ • 길이의 배열을 λ§Œλ“€μ–΄ μ—°μ†λœ 수λ₯Ό 넣을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. (μ°Έκ³ )
μ•„λž˜ μ½”λ“œμ—μ„œ length 길이와, λ°°μ—΄μ˜ 값이 λ˜λŠ” i에 수λ₯Ό λ”ν•˜κ±°λ‚˜ λΉΌμ£Όλ©΄ λ‚΄κ°€ μ›ν•˜λŠ” λ²”μœ„μ˜ μ—°μ†λœ 수둜 이뀄진 배열이 λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.

Array.from({length: 5}, (v, i) => i); // [0, 1, 2, 3, 4]
Array.from({length: 7}, (v, i) => i-3); // [-3, -2, -1, 0, 1, 2, 3]

μ–΄λ–»κ²Œ 이런 배열이 λ‚˜μ˜¬ 수 μžˆμ„κΉŒμš”? λ©”μ„œλ“œκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ” 지 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

첫 째둜, {length: x}λŠ” x 길이의 μœ μ‚¬ λ°°μ—΄ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

μ½˜μ†”μ—μ„œ 일반 λ°°μ—΄μ˜ 값을 열어보면 μΈλ±μŠ€μ™€ κ°’, length 속성을 확인할 수 μžˆλŠ”λ°μš”, 이 κ΅¬μ„±μœΌλ‘œ 객체λ₯Ό λ§Œλ“  것이 μœ μ‚¬ λ°°μ—΄ κ°μ²΄μž…λ‹ˆλ‹€. λ°°μ—΄μ²˜λŸΌ obj[0], obj[1], obj.length와 같은 μ°Έμ‘°κ°€ κ°€λŠ₯ν•˜μ§€λ§Œ, 배열이 μ•„λ‹Œ κ°μ²΄λΌλŠ” κ²λ‹ˆλ‹€.

μ°Έκ³  이미지

그리고 이 μœ μ‚¬ λ°°μ—΄ 객체에 length κ°’λ§Œ μž…λ ₯ν•΄μ£Όμ—ˆμœΌλ‹ˆ, Array.from λ©”μ„œλ“œκ°€ 값은 undefined둜 μ±„μ›Œμ§„ 배열을 λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€.

이미지

ν•˜μ§€λ§Œ μš°λ¦¬κ°€ λ§Œλ“€κ³ μž ν•˜λŠ” 것은 μ—°μ†λœ 수둜 이루어진, 즉 인덱슀(0~4) 값이 μ±„μ›Œμ§„ λ°°μ—΄μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ mdn λ‚΄μš© 쀑에 주의 깊게 λ΄μ•Όν•˜λŠ” 뢀뢄이 μžˆμŠ΅λ‹ˆλ‹€.

Array.from()은 선택 λ§€κ°œλ³€μˆ˜μΈ mapFnλ₯Ό κ°€μ§€λŠ”λ°, λ°°μ—΄(ν˜Ήμ€ λ°°μ—΄ μ„œλΈŒν΄λž˜μŠ€)의 각 μš”μ†Œλ₯Ό 맡핑할 λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, Array.from(obj, mapFn, thisArg)λŠ” 쀑간에 λ‹€λ₯Έ 배열을 μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점을 μ œμ™Έν•˜λ©΄ Array.from(obj).map(mapFn, thisArg)와 κ°™μŠ΅λ‹ˆλ‹€. 이 νŠΉμ§•μ€ typed arrays와 같은 νŠΉμ • λ°°μ—΄ μ„œλΈŒν΄λž˜μŠ€μ—μ„œ 쀑간 λ°°μ—΄ 값이 μ μ ˆν•œ μœ ν˜•μ— 맞게 μƒλž΅λ˜κΈ° λ•Œλ¬Έμ— 특히 μ€‘μš”ν•©λ‹ˆλ‹€.

μ„€λͺ…κ³Ό 같이 map λ©”μ„œλ“œκ°€ μ—°κ²°λœ ꡬ쑰둜 이해해 λ΄…μ‹œλ‹€.
map λ©”μ„œλ“œλŠ” 첫 번째 λ§€κ°œλ³€μˆ˜(currentValue)둜 값을, 두 번째 λ§€κ°œλ³€μˆ˜(index)둜 인덱슀λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

arr.map(callback(currentValue[, index[, array]])[, thisArg])

κ·ΈλŸ¬λ―€λ‘œ Array.from λ©”μ„œλ“œμ—μ„œλ„ 인덱슀λ₯Ό μ°Έμ‘°ν•˜λ €λ©΄ 두 개의 λ§€κ°œλ³€μˆ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
그리고 인덱슀λ₯Ό μ°Έμ‘°ν•˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό μƒˆλ‘œμš΄ λ°°μ—΄μ˜ κ°’μœΌλ‘œ λ°˜ν™˜ν•΄μ£Όμ„Έμš”.
λ§Œλ“€κ³ μž ν–ˆλ˜ 배열을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€!

이미지

Array.from({length: 5}, x => x); // κ°’λ§Œ λ§€κ°œλ³€μˆ˜λ‘œ λ°›μŒ => μƒˆλ‘œμš΄ λ°°μ—΄μ˜ 값은 κΈ°μ‘΄ λ°°μ—΄μ˜ κ°’
Array.from({length: 5}, (value, index) => index); // κ°’κ³Ό 인덱슀λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›μŒ => μƒˆλ‘œμš΄ λ°°μ—΄μ˜ 값은 κΈ°μ‘΄ λ°°μ—΄μ˜ 인덱슀

ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ μ΅μˆ™μΉ˜ μ•Šμ€ 뢄듀을 μœ„ν•œ κΈ°λ³Έ ν•¨μˆ˜ ν‘œν˜„λ²• μ˜ˆμ‹œμž…λ‹ˆλ‹€.

Array.from({length: 5}, function(value, index){
     return index;
});

이해가 λ˜μ…¨λ‹€λ©΄ μ’‹κ² λ„€μš”!πŸ˜„

μ½”λ“œμŠ€ν…Œμ΄μΈ μ—μ„œ μ•Œκ³ λ¦¬μ¦˜ ν€΄μ¦ˆλ₯Ό μ—¬λŸ¬κ°€μ§€ λ°©λ²•μœΌλ‘œ 풀어보닀가 Array.from λ©”μ„œλ“œλ₯Ό 써보게 λ˜μ—ˆλŠ”λ°, μ–΄λ–€ μ›λ¦¬λ‘œ 값이 λ§Œλ“€μ–΄μ§€λŠ”μ§€ μ½”λ“œλ§Œ λ΄μ„œλŠ” 이해가 μ•ˆλ˜μ–΄μ„œ ν¬μŠ€νŒ…μ„ μž‘μ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜ μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°μ˜ κΈ€κ³Ό mdn을 μ°Έκ³ ν–ˆμŠ΅λ‹ˆλ‹€.
https://stackoverflow.com/questions/40528557/how-does-array-fromlength-5-v-i-i-work

← 이전 κ²Œμ‹œλ¬Ό2019/08/21 TIL(Today I Learn)
λ‹€μŒ κ²Œμ‹œλ¬Ό β†’2019/08/17 TIL(Today I Learn)
λͺ©λ‘