๊ฐ ํํ๋ฉด์ Array.from()์ ์ธ์ผ์ด ๊ฝค ๋ง์ด ์๊ฒผ๋๋ฐ, ์ด๊ฑฐ ์ค๋ช ์ ๋ฃ์๋ ์ง์ง ๋ฌด์จ์๋ฆฐ์ง ๋ชจ๋ฅด๊ฒ ์ด์ ์ ๋ฆฌํ๋ค.
1. ์ ์
Array.from()์ '์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ ํจ์'๋ผ๊ณ ํ๋๋ฐ, ๊ทธ๋ผ ์ฌ๊ธฐ์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๊ฐ ๋ฌด์์ธ์ง ์์์ผ ํ๋ค.
(1) ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด
'์ฐจ๋ก๋๋ก ํ๋์ฉ ๊บผ๋ผ ์ ์๋ ๊ฒ'์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ผ๊ณ ํ๋ค.
๐ฌ ์งํผํฐ์ ์์ ๐ฝ
- ๋ค๊ฐ ์ฌํ์ด 5๊ฐ ๋ค์ด ์๋ ๋ด์ง๋ฅผ ๋ค๊ณ ์์ด.
- ๋ด์ง๋ฅผ ๋ฏ์ด์ ํ๋์ฉ ๊บผ๋ผ ์ ์์ง?
- ์ด ๋ด์ง = ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด
- ์ฌํ ํ๋์ฉ ๊บผ๋ด๋ ๊ณผ์ = ๋ฐ๋ณต(iteration)
์ฆ, ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ ‘๋ฐ๋ณตํ ์ ์๋ ์๋ฃ’ ๋ผ๋ ๋ป์ด์ผ.
๊ทธ๋ฌ๋ฏ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ผ ํ๋ฉด
- ๋ฌธ์์ด(String) : "hello"๋ฅผ ํ๋์ฉ ๊บผ๋ด๋ฉด h, e, l, l, o
- ๋ฐฐ์ด(Array) : [1, 2, 3] ํ๋์ฉ ๊บผ๋ด๋ฉด 1, 2, 3
- Set, Map๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ค
- NodeList : document.querySelectorAll()์ ๊ฒฐ๊ณผ
- arguments : ํจ์์ ์ ๋ฌ๋ ์ธ์ ๋ชจ์
์ด ์น๊ตฌ๋ค์ด๋ผ ์๊ฐํ๋ฉด ๋ ๊ฒ์ด๋ค.
์ด ์น๊ตฌ๋ค์ ํน์ ํ ์ํ ๊ท์น์ ๋ฐ๋ฅด๋๋ฐ, ๊ทธ ๊ท์น์ ์ํ ๊ท์ฝ(Iteration Protocols)๋ผ๊ณ ํ๋ค.
์ํ ๊ท์ฝ์ ๋ฐ๋ผ ์ดํฐ๋ฌ๋ธ๋ค์ for ... of ๋ฌธ์ผ๋ก ์ํํ ์ ์๋ค. ์์ธํ๊ฑด ๋ค์์!
(2) ์ํ ๊ท์ฝ
์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ค์ด ๋ฐ๋ฅด๊ธฐ๋ ํ๊ณ , ์ํ๋ฅผ ํ์คํํ๊ธฐ ์ํ ๊ท์น(protocols)๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
1๏ธโฃ Iterable interface
๐ "์ด ๊ฐ์ฒด๋ ๋ฐ๋ณตํ ์ ์๋ค"๋ ๊ท์น
๊ฐ์ฒด๊ฐ ์ํ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค
- ๊ฐ์ฒด์ @@iterator(์ฆ [Symbol.iterator] ๋ฉ์๋)๊ฐ ์์ด์ผ ํ๋ค. → @@iterator = "์ด ๊ฐ์ฒด์ ๋ฐ๋ณต ๋ฉ์๋ ํค๋ Symbol.iterator์์" ๋ผ๋ ์๋ฏธ. ์ค์ ์ฝ๋์์ ๋ฌด์กฐ๊ฑด Symbol.iterator๋ฅผ ์จ์ผ ํ๋ค.
- Symbol.iterator๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด Iterator ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ค.,
- for ... of ๋ฌธ์ผ๋ก ์ํํ ์ ์๋ค.
2๏ธโฃ Iterator interface
๐ "์ด๋ป๊ฒ ํ๋์ฉ ๊บผ๋ผ ๊ฒ์ธ๊ฐ"์ ๋ํ ๊ท์น
์ํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ค์ ๋ก ์ํํ ๋ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์
- ๊ฐ์ฒด๊ฐ next() ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- ์ด ๋ next()๋ {value, done}์ ๋ฐํํด์ผ ํ๋ค.
์์งํ ๊ธ๋ก๋ง ๋ณด๋ฉด ๋ฌด์จ ์๋ฆฐ์ง ์ ๋ ๋ชจ๋ฅด๋๊น ์ฝ๋ ์์๋ฅผ ๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
const arr = [10, 20, 30]
const iterator = arr[Symbol.iterator]()
console.log(iterator.next()) // { value: 10, done: false }
console.log(iterator.next()) // { value: 20, done: false }
console.log(iterator.next()) // { value: 30, done: false }
console.log(iterator.next()) // { value: undefined, done: true }
1๏ธโฃ ์ฌ๊ธฐ์ arr[Symbols.iterator] → ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋๋ ๊ธฐ๊ณ
= ๋ฐฐ์ด ์์ ๊ฐ(10, 20, 30)์ ํ๋์ฉ ๊บผ๋ผ ์ ์๋๋ก ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ์ญํ .
arr์ ์ด๋ฏธ Iterable์ด๊ณ (๋ฐฐ์ด์ด๋๊น), arr[Symbol.iterator]()์ ํธ์ถํ๋ฉด ๊ทธ ๋ด๋ถ์์ Iterator์ ๋ฝ์์ผ ํ๋ค.
2๏ธโฃ iterator.next() → ๊ธฐ๊ณ๋ฅผ ๋๋ ค์ ๊ฐ ํ๋์ฉ ๊บผ๋ด๊ธฐ
next()๋ ํญ์ { value, done } ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋๋ฐ,
- value: ํ์ฌ ๊ฐ
- done: ๋๋ฌ๋์ง ์ฌ๋ถ (true๋ฉด ์ํ ์ข ๋ฃ)
์ด๋ค.
(3) ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด
์ง์ง ๋ฐฐ์ด์ ์๋์ง๋ง ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ก ์ฌ๋ฌ ํญ๋ชฉ์ ์ ๊ทผํ ์ ์๊ณ length์์ฑ๋ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด.
๋ํ์ ์ผ๋ก
- ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ argument
- DOM ๊ด๋ จ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด(NodeList, HTMLCollection)
- NodeList : document.querySelectorAll()์ ๊ฒฐ๊ณผ. ์ ์ฌ๋ฐฐ์ด + ์ดํฐ๋ฌ๋ธ(for...of ๊ฐ๋ฅ)
- HTMLCollection : document.getElementsByTagName(), getElemetsByClassName() ๊ฐ์ ๊ฒฐ๊ณผ, ์ ์ฌ๋ฐฐ์ด์ ๋ง์ง๋ง ์ดํฐ๋ฌ๋ธ์ ์๋(for...of ๋ถ๊ฐ)
- ๋ฌธ์์ด String
๊ฐ์๊ฒ ์๋ค.
โ argument ์์
function test(a, b, c){
console.log(arguments) // Arguments(3) [10, 20, 30, callee: ƒ, Symbol(Symbol.iterator): ƒ]
console.log(arguments[0]) // 10
console.log(arguments.length) // 3
}
test(10, 20, 30)
โ NodeList ์์
<ul>
<li>๊น๋ฐฅ</li>
<li>๋ผ๋ฉด</li>
<li>๋ก๋ณถ์ด</li>
</ul>
์ฌ๊ธฐ์ li์ ์๋ ๊ฐ๋ค์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด ์ค NodeList ์ด๋ค.
const liElements = document.querySelectorAll("li")
console.log(liElements) // NodeList(3) [li, li, li]
for (let i = 0; i < liElements.length; i++) {
console.log(liElements[i].textContent)
// ์ถ๋ ฅ: "๊น๋ฐฅ" "๋ผ๋ฉด" "๋ก๋ณถ์ด"
}
๋ฐ๋ผ์ ์์ ๊ฐ์ด
- length ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ
- ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ผ๋ฉฐ(ex. obj[0], obj[1])
- for๋ฌธ์ผ๋ก ๋ฐ๋ณตํ ์ ์๋ค.
์ง์ง ๋ฐฐ์ด์ ์๋๊ธฐ ๋๋ฌธ์ map(), filter(), push()์ ๊ฐ์ ์ง์ง ๋ฐฐ์ด ์ ์ฉ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ง์ง ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, Array.from()์ ์ฌ์ฉํด์ผ ํ๋ค!
2. Array.from()์ด๋
์ด๊ฑฐ ์ค๋ช ํ๋ ค๊ณ ์์ ์๋ ๊ฒ๋ค ์น ๋ค ์ค๋ช ํ๊ฑฐ๋ค...
์ด ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ค์ ๋ฐฐ์ด์ ์๋์ง๋ง ๋ฐฐ์ด์ฒ๋ผ ๋ณด์ด๋ ๊ฐ์ฒด๋ค์ ์ง์ง ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
const str = "Hello" // ๋ฌธ์์ด, ์ ์ฌ ๊ฐ์ฒด
console.log(Array.from(str)) // ์ถ๋ ฅ: ['H', 'e', 'l', 'l', 'o']
Array.from์ ์๊น์๋ ๋ค์๊ณผ ๊ฐ๋ค.
Array.from(arrayLike, mapFn, thisArg)
- arrayLike : ์ ์ฌ ๊ฐ์ฒด (ํ์๊ฐ)
- mapFn : ๊ฐ ์์์ ์ ์ฉํ ํจ์ (์ ํ)
- thisArg : mapFn ์คํ ์ this๋ก ์ฌ์ฉํ ๊ฐ (์ ํ)
3. ํน์ง
1๏ธโฃ๋ง์ฝ arrayLike ์ธ์๊ฐ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด ํน์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๊ฐ ์๋๋ฉด ๋น ๋ฐฐ์ด[ ]์ ๋ฐํํ๋ค.
const num = 1 // ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๊ฐ ์๋ ์ซ์
console.log(Array.from(num)) // [] ์ถ๋ ฅ
2๏ธโฃ๋๋ฒ์งธ ์ธ์ mapFn์์ ๊ฐ ์์์ ๋ํ ๋ณํ ์์ ์ ์คํํ ์ ์๋ค.
const numArr = [1, 2, 3, 4, 5]
const double = Array.from(numArr, num -> num * 2)
console.log(double) // [2, 4, 6, 8, 10]
[์ฐธ๊ณ ๋ฌธํ]
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from
Array.from() - JavaScript | MDN
console.log(Array.from("foo")); // Expected output: Array ["f", "o", "o"] console.log(Array.from([1, 2, 3], (x) => x + x)); // Expected output: Array [2, 4, 6] Array.from(arrayLike) Array.from(arrayLike, mapFn) Array.from(arrayLike, mapFn, thisArg) arrayLi
developer.mozilla.org
์๋ฐ์คํฌ๋ฆฝํธ Array.from() ํจ์ – ์ ์ฌ ๋ฐฐ์ด๊ณผ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก - ์ฝ๋ฉ์๋ธ๋ฆฌ๋ฐ๋
Array.from() ํจ์๋ ์ง์ ํ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ ํจ์๋ก, ํด๋น ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ฒ๋ผ ๋ค๋ฃจ๊ณ ์ถ์ ๋ ์ฝ๊ณ ์ ์ฉํฉ๋๋ค.
codingeverybody.kr
์๋ฐ์คํฌ๋ฆฝํธ Iteration Protocols – ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด - ์ฝ๋ฉ์๋ธ๋ฆฌ๋ฐ๋
์๋ฐ์คํฌ๋ฆฝํธ Iteration Protocols๋ ์ํ ๊ท์ฝ(protocol, ํ๋กํ ์ฝ)์ผ๋ก, ES6 ์ดํ ๋ฐฐ์ด, ๋ฌธ์์ด, Map, Set ๋ฑ ๋ค์ํ ๊ฐ์ฒด๋ฅผ ์ผ๊ด๋๊ฒ ์ํํ ์ ์๊ฒ ํ๋ ํ์ค์ ์ ๊ณตํฉ๋๋ค.
codingeverybody.kr
์๋ฐ์คํฌ๋ฆฝํธ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด(Array-like Objects) – ๊ฐ๋ ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ - ์ฝ๋ฉ์๋ธ๋ฆฌ๋ฐ๋
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด๋ ์ง์ง ๋ฐฐ์ด์ ์๋์ง๋ง, ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ฌ๋ฌ ํญ๋ชฉ์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , length ์์ฑ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ ํ ํํ์ ๋๋ค.
codingeverybody.kr
[JS] ๐ ์ดํฐ๋ฌ๋ธ & ์ดํฐ๋ ์ดํฐ - ๐ฏ์๋ฒฝ ์ดํด
์ดํฐ๋ฌ๋ธ(interable) ์ดํฐ๋ฌ๋ธ(interable)์ด๋ ์๋ฃ๋ฅผ ๋ฐ๋ณตํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ์ฐ๋ ๋ฐฐ์ด ์ญ์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด์ด๋ค. ๊ทธ๋ผ ๋ง์ผ ์ด ๋ฐฐ์ด์๊ฒ ์ดํฐ๋ฌ๋ธ ํ์์ ์์ ๋ฒ๋ฆฌ๋ฉด ์ด
inpa.tistory.com
'Frontend๐จ > JavaScript๐, TypeScript๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| sort()์ ๋ํด ์์๋ณด๊ธฐ (0) | 2025.12.03 |
|---|---|
| JavaScript ํ์ดํ ํจ์ ๊ดํธ ์ฌ์ฉ๋ฒ ์ ๋ฆฌ(+์ต๋ช ํจ์) (0) | 2025.11.10 |
| ์ฝ๋ฐฑ ํจ์(callback function) ์ ๋ฆฌํ๊ธฐ (1) | 2025.07.09 |
| [JavaScript, TypeScript] map(), filter(), some()๋ฉ์๋ (0) | 2024.12.21 |
| [JavaScript, TypeScript] ์ต์ ๋ ์ฒด์ด๋(Optional Chaining)์ด๋? (3) | 2024.12.10 |