[πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ] 27μž₯. λ°°μ—΄

λ…Έμ˜μ™„Β·2024λ…„ 1μ›” 16일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
22/23
post-thumbnail
post-custom-banner

λ°°μ—΄

1. λ°°μ—΄μ΄λž€?

배열은 μ—¬λŸ¬ 개의 값을 순차적으둜 λ‚˜μ—΄ν•œ μžλ£Œκ΅¬μ‘°λ‹€.

// λ°°μ—΄ λ¦¬ν„°λŸ΄
const arr = ['apple', 'banana', 'orange'];

배열이 가지고 μžˆλŠ” 값을 μš”μ†ŒλΌκ³  λΆ€λ₯΄λ©°, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  값은 λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 수 μžˆλ‹€.

λ°°μ—΄μ˜ μš”μ†ŒλŠ” λ°°μ—΄μ—μ„œ μžμ‹ μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 0 μ΄μƒμ˜ μ •μˆ˜μΈ 인덱슀λ₯Ό κ°–λŠ”λ‹€. μΈλ±μŠ€λŠ” λ°°μ—΄μ˜ μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•œλ‹€. λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ 인덱슀 0λΆ€ν„° μ‹œμž‘ν•œλ‹€.

μš”μ†Œμ— μ ‘κ·Όν•  λŒ€λŠ” λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œλ‹€.

arr[0] // 'apple'
arr[1] // 'banana'
arr[2] // 'orange'

λ°°μ—΄μ˜ μš”μ†Œμ˜ 개수, 즉 λ°°μ—΄μ˜ 길이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€

arr.length // -> 3

배열은 μΈλ±μŠ€μ™€ length ν”„λ‘œνΌν‹°λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— for 문을 톡해 순차적으둜 μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€.

// λ°°μ—΄μ˜ 순회
for (let i = 0; i < arr.length; i++) {
  console.log(arr[i]); // 'apple' 'banana' 'orange'
}

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” λ°°μ—΄μ΄λΌλŠ” νƒ€μž…μ€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. 배열은 객체 νƒ€μž…μ΄λ‹€.

배열은 λ°°μ—΄ λ¦¬ν„°λŸ΄ Array μƒμ„±μž ν•¨μˆ˜ Array.of Array.from λ©”μ„œλ“œλ‘œ 생성할 수 μžˆλ‹€.

λ°°μ—΄μ˜ μƒμ„±μž ν•¨μˆ˜λŠ” Array이며, λ°°μ—΄μ˜ ν”„λ‘œν† νƒ€μž… κ°μ²΄λŠ” Array.prototype이며 Array.prototype은 배열을 μœ„ν•œ 빌트인 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

const arr = [1, 2, 3];

arr.constructor === Array // -> true
Object.getPrototypeOF(arr) === Array.prototype // -> true

πŸ’‘ λ°°μ—΄ 일반객체 κ΅¬λ³„λ˜λŠ” νŠΉμ§•

ꡬ뢄객체배열
κ΅¬μ‘°ν”„λ‘œνΌν‹° 킀와 ν”„λ‘œνΌν‹° κ°’μΈλ±μŠ€μ™€ μš”μ†Œ
κ°’μ˜ μ°Έμ‘°ν”„λ‘œνΌν‹° ν‚€μΈλ±μŠ€
κ°’μ˜ μˆœμ„œXO
length ν”„λ‘œνΌν‹°XO

λ°°μ—΄μ˜ μž₯점은 μ²˜μŒλΆ€ν„° ν˜Ήμ€ λ§ˆμ§€λ§‰λΆ€ν„° μ—­μˆœμœΌλ‘œ μš”μ†Œμ— μ ‘κ·Όν•  μˆ˜λ„ 있으며, νŠΉμ • μœ„μΉ˜λΆ€ν„° 순차적으둜 μš”μ†Œμ— μ ‘κ·Όν•  μˆ˜λ„ μžˆλ‹€. μ΄λŠ” 배열이 인덱슀 length ν”„λ‘œνΌν‹°λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•˜λ‹€.

2. μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 배열이 μ•„λ‹ˆλ‹€.

μžλ£Œκ΅¬μ‘°μ—μ„œ λ§ν•˜λŠ” 배열은 λ™μΌν•œ 크기의 λ©”λͺ¨λ¦¬ 곡간이 λΉˆν‹ˆμ—†μ΄ μ—°μ†μ μœΌλ‘œ λ‚˜μ—°λœ 자료ꡬ쑰λ₯Ό λ§ν•œλ‹€. ν•˜λ‚˜μ˜ 데이터 νƒ€μž…μœΌλ‘œ ν†΅μΌλ˜μ–΄ 있으며 μ„œλ‘œ μ—°μ†μ μœΌλ‘œ 인접해 μžˆλ‹€. 이λ₯Ό 밀집 배열이라 ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 ν”νžˆ μ•Œκ³  μžˆλŠ” 일반적인 의미의 λ°°μ—΄κ³Ό λ‹€λ₯΄λ‹€. 즉, λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μœ„ν•œ 각각의 λ©”λͺ¨λ¦¬ 곡간은 λ™μΌν•œ 크기λ₯Ό 갖지 μ•Šμ•„λ„ 되며, μ—°μ†μ μœΌλ‘œ 이어져 μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ°°μ—΄μ˜ μš”μ†Œκ°€ μ—°μ†μ μœΌλ‘œ 이어져 μžˆμ§€ μ•ŠλŠ” 배열을 ν¬μ†Œ 배열이라 ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 일반적인 λ°°μ—΄μ˜ λ™μž‘μ„ 흉내낸 νŠΉμˆ˜ν•œ 객체닀.

πŸ’‘ 일반적인 λ°°μ—΄κ³Ό μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄μ˜ μž₯단점

  • 일반적인 배열은 인덱슀둜 μš”μ†Œμ— λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ μš”μ†Œλ₯Ό μ‚½μž… λ˜λŠ” μ‚­μ œν•˜λŠ” κ²½μš°μ—λŠ” νš¨μœ¨μ μ΄μ§€ μ•Šλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 ν•΄μ‹œ ν…Œμ΄λΈ”λ‘œ κ΅¬ν˜„λœ κ°μ²΄μ΄λ―€λ‘œ 인덱슀둜 μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” 경우 일반적인 배열보닀 μ„±λŠ₯적인 λ©΄μ—μ„œ 느릴 μˆ˜λ°–μ— μ—†λŠ” ꡬ쑰적인 단점이 μžˆλ‹€. ν•˜μ§€λ§Œ μš”μ†Œλ₯Ό μ‚½μž… λ˜λŠ” μ‚­μ œν•˜λŠ” κ²½μš°λ„€λŠ” 일반적인 배열보닀 λΉ λ₯Έ μ„±λŠ₯을 κΈ°λŒ€ν•  수 μžˆλ‹€.

3. length ν”„λ‘œνΌν‹°μ™€ ν¬μ†Œ λ°°μ—΄

length ν”„λ‘œνΌν‹°λŠ” μš”μ†Œμ˜ 개수, 즉 λ°°μ—΄μ˜ 길이λ₯Ό λ‚˜νƒ€λ‚΄λŠ 0 μ΄μƒμ˜ μ •μˆ˜λ₯Ό κ°’μœΌλ‘œ κ°–λŠ”λ‹€.

[].length // -> 0
[1,2,3].length // -> 3

length ν”„λ‘œνΌν‹°μ˜ 값은 배열에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•˜λ©΄ μžλ™ κ°±μ‹ λœλ‹€.

const arr [1, 2, 3];
console.log(arr.length); // 3

// μš”μ†Œ μΆ”κ°€
arr.push(4);
// μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ©΄ length ν”„λ‘œνΌν‹° 값이 μžλ™ κ°±μ‹ λœλ‹€.
console.log(arr.length); // 4

// μš”μ†Œ μ‚­μ œ
arr.pop();
// μš”μ†Œλ₯Ό μ‚­μ œν•˜λ©΄ length ν”„λ‘œνΌν‹°μ˜ 값이 μžλ™ κ°±μ‹ λœλ‹€.
console.log(arr.length); // 3

length ν”„λ‘œνΌν‹°μ˜ 값은 μš”μ†Œμ˜ 개수, 즉 λ°°μ—΄μ˜ 길이λ₯Ό λ°”νƒ•μœΌλ‘œ κ²°μ •λ˜μ§€λ§Œ μž„μ˜μ˜ 숫자 값을 λͺ…μ‹œμ μœΌλ‘œ ν• λ‹Ήν•  μˆ˜λ„ μžˆλ‹€.

ν˜„μž¬ length ν”„λ‘œνΌν‹°μ˜ 값보닀 μž‘μ€ 숫자 값을 ν• λ‹Ήν•˜λ©΄ λ°°μ—΄μ˜ 길이가 쀄어든닀.

const arr = [1, 2, 3, 4, 5];

// ν˜„μž¬ length ν”„λ‘œνΌν‹° 값인 5보닀 μž‘μ€ 숫자 κ°’ 3을 length ν”„λ‘œνΌν‹°μ— ν• λ‹Ή
arr.length = 3;

// λ°°μ—΄μ˜ 길이가 5μ—μ„œ 3으둜 쀄어든닀.
console.log(arr); // [1, 2, 3]

주의 할것은 ν˜„μž¬ length ν”„λ‘œνΌν‹°μ˜ 값보닀 큰 숫자 값을 ν• λ‹Ήν•˜λŠ” 경우 μ΄λ•Œ length ν”„λ‘œνΌν‹°μ˜ 값은 λ³€κ²½λ˜μ§€λ§Œ μ‹€μ œλ‘œ λ°°μ—΄μ˜ 길이가 λŠ˜μ–΄λ‚˜μ§€λŠ” μ•ŠλŠ”λ‹€.

const arr = [1]

// ν˜„μž¬ length ν”„λ‘œνΌν‹° 값인 1보닀 큰 숫자 κ°’ 3을 length ν”„λ‘œνΌν‹°μ— ν• λ‹Ή
arr.length = 3;

// length ν”„λ‘œνΌν‹° 값은 λ³€κ²½λ˜μ§€λ§Œ μ‹€μ œλ‘œ λ°°μ—΄μ˜ 길이가 λŠ˜μ–΄λ‚˜μ§€λŠ” μ•ŠλŠ”λ‹€.
console.log(arr.length); // 3
console.loga(arr); // [1, empty * 2]

일반적인 λ°°μ—΄μ˜ lengthλŠ” λ°°μ—΄ μš”μ†Œμ˜ 개수, 즉 λ°°μ—΄μ˜ 길이와 μ–Έμ œλ‚˜ μΌμΉ˜ν•œλ‹€. ν•˜μ§€λ§Œ ν¬μ†Œ 배열은 length와 λ°°μ—΄ μš”μ†Œμ˜ κ°œμˆ˜κ°€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€. ν¬μ†Œ λ°°μ—΄μ˜ lengthλŠ” ν¬μ†Œ λ°°μ—΄μ˜ μ‹€μ œ μš”μ†Œ κ°œμˆ˜λ³΄λ‹€ μ–Έμ œλ‚˜ 크닀.

배열을 생성할 κ²½μš°μ—λŠ” ν¬μ†Œλ°°μ—΄μ„ μƒμ„±ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μž λ°°μ—΄μ—λŠ” 닽은 νƒ€μž…μ˜ μš”μ†Œλ₯Ό μ—°μ†μ μœΌλ‘œ μœ„μΉ˜μ‹œν‚€λŠ” 것이 μ΅œμ„ μ΄λ‹€.

4. λ°°μ—΄ 생성

4-1. λ°°μ—΄ λ¦¬ν„°λŸ΄

λ°°μ—΄ λ¦¬ν„°λŸ΄μ€ 0개 μ΄μƒμ˜ μš”μ†Œλ₯Ό μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ λŒ€κ΄„ν˜Έ([])둜 λ¬ΆλŠ”λ‹€. λ˜ν•œ, κ°’λ§Œ μ‘΄μž¬ν•œλ‹€.

const arr = [ 1, 2, 3];
console.log(arr.length); // 3

λ°°μ—΄ λ¦¬ν„ΈλŸ¬μ— μš”μ†Ÿλ₯Ό ν•˜λ‚˜λ„ μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ©΄ λ°°μ—΄μ˜ 길이, 즉 length ν”„λ‘œνΌν‹° 값이 0인 빈 배열이 λœλ‹€.

const arr = [];
console.log(arr.length); // 0

λ°°μ—΄ λ¦¬ν„°λŸ΄μ— μš”μ†Œλ₯Ό μƒλž΅ν•˜λ©΄ ν¬μ†Œ 배열이 μƒμ„±λœλ‹€.

const arr = [1, , 3]; // ν¬μ†Œ λ°°μ—΄

// ν¬μ†Œ λ°°μ—΄μ˜ lengthλŠ” λ°°μ—΄μ˜ μ‹€μ œ μš”μ†Œ κ°œμˆ˜λ³΄λ‹€ μ–Έμ œλ‚˜ 크닀.
console.log(arr.length); //3
console.log(arr); // [1, empty, 3]
console.log(arr[1); // undefined

4-2. Array μƒμ„±μž ν•¨μˆ˜

Array μƒμ„±μž ν•¨μˆ˜λŠ” μ „λ‹¬λœ 인수의 κ°œμˆ˜μ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λ―€λ‘œ 주의

1️⃣ μ „λ‹¬λœ μΈμˆ˜κ°€ 1개이고 숫자인 경우 length ν”„λ‘œνΌν‹° 값이 인수인 배열을 μƒμ„±ν•œλ‹€.

const arr = new Array(10);

console.log(arr); // [empty * 10]
console.log(arr.length); // 10

μ΄λ•Œ μƒμ„±λœ 배열은 ν¬μ†Œλ°°μ—΄μ΄λ‹€. length ν”„λ‘œνΌν‹° 값은 0이 μ•„λ‹ˆμ§€λ§Œ μ‹€μ œλ‘œ λ°°μ—΄μ˜ μš”μ†ŒλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

2️⃣ μ „λ‹¬λœ μΈμˆ˜κ°€ μ—†λŠ” 경우 빈 배열을 μƒμ„±ν•œλ‹€. 즉, λ°°μ—΄ λ¦¬ν„°λŸ΄ []κ³Ό κ°™λ‹€.

new Array(); // -> []

3️⃣ μ „λ‹¬λœ μΈμˆ˜κ°€ 2개 μ΄μƒμ΄κ±°λ‚˜ μˆ«μžκ°€ μ•„λ‹Œ 경우 μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.

// μ „λ‹¬λœ μΈμˆ˜κ°€ 2개 이상이면 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.
new Array(1, 2, 3); // [1, 2, 3]

// μ „λ‹¬λœ μΈμˆ˜κ°€ 1κ°œμ§€λ§Œ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.
new Array({}); // -> [{}]

Array μƒμ„±μž ν•¨μˆ˜λŠ” new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜μ§€ μ•Šλ”λΌλ„, 즉 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•΄λ„ 배열을 μƒμ„±ν•˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ λ™μž‘ν•œλ‹€. μ΄λŠ” Array μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ new.target을 ν™•μΈν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

Array(1, 2, 3); // -> [1, 2, 3]

4-3. Array.of

ES6 μ—μ„œ λ„μž…λœ Array.of λ©”μ„œλ“œλŠ” μ „λ‹¬λœ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€. Array.ofλŠ” Array μƒμ„±μž ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ μ „λ‹¬λœ μΈμˆ˜κ°€ 1개이고 μˆ«μžμ΄λ”λΌλ„ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.

// μ „λ‹¬λœ μΈμˆ˜κ°€ 1개이고 μˆ«μžμ΄λ”λΌλ„ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.
Array.of(1); // -> [1]

Array.of(1, 2, 3); // -> [1, 2, 3]

Array.of('stfing'); // -> ['string']

4-4. Array.from

ES6μ—μ„œ λ„μž…λœ Array.from λ©”μ„œλ“œλŠ” μœ μ‚¬ λ°°μ—΄ 객체 λ˜λŠ” μ΄ν„°λŸ¬λΈ” 객체λ₯Ό 인수둜 전달받아 λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

// μœ μ‚¬ λ°°μ—΄ 객체λ₯Ό λ³€ν™˜ν•˜μ—¬ 배열을 μƒμ„±ν•œλ‹€.
Array.from( { length: 2, 0 : 'a', 1: 'b' }); // -> ['a', 'b']

// μ΄ν„°λŸ¬λΈ”μ„ λ³€ν™˜ν•˜μ—¬ 배열을 μƒμ„±ν•œλ‹€. λ¬Έμžμ—΄μ„ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.
Array.from('Hello'); // -> ['H', 'e', 'l', 'l', 'o']

// Array.from에 length만 μ‘΄μž¬ν•˜λŠ” μœ μ‚¬ λ°°μ—΄ 객체λ₯Ό μ „λ‹¬ν•˜λ©΄ undefinedλ₯Ό μš”μ†Œλ‘œ μ±„μš΄λ‹€.
Array.from({ length: 3}); // -> [undefined, undefined, undefined]

// Array.from은 두 번째 인수둜 μ „λ‹¬ν•œ 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ κ΅¬μ„±λœ 배열을 λ°˜ν™˜ν•œλ‹€.
Array.from({ length: 3}, (_, i) => i); // -> [0, 1, 2]

5. λ°°μ—΄ μš”μ†Œμ˜ μ°Έμ‘°

λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ°Έμ‘°ν•  λ•Œμ—λŠ” λŒ€κ΄„ν˜Έ([]) ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œλ‹€.

const arr = [1,2];

// μΈλ±μŠ€κ°€ 0인 μš”μ†Œλ₯Ό μ°Έμ‘°
console.log(arr[0]); // 1
// μΈλ±μŠ€κ°€ 1인 μš”μ†Œλ₯Ό μ°Έμ‘°
console.log(arr[1]); // 2

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μš”μ†Œμ— μ ‘κ·Όν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λœλ‹€.

const arr = [1, 2];

// μΈλ±μŠ€κ°€ 2인 μš”μ†Œλ₯Ό μ°Έμ‘°, λ°°μ—΄ arrμ—λŠ” μΈλ±μŠ€κ°€ 2인 μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(arr[2]); // undefined

6. λ°°μ—΄ μš”μ†Œμ˜ 좔가와 κ°±μ‹ 

객체에 ν”„λ‘œνΌν‹°λ₯Ό λ™μ μœΌλ‘œ μΆ”κ°€ν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌ 배열에도 μš”μ†Œλ₯Ό λ™μ μœΌλ‘œ μΆ”κ°€ν•  수 μžˆλ‹€. μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 인덱슀λ₯Ό μ‚¬μš©ν•΄ 값을 ν• λ‹Ήν•˜λ©΄ μƒˆλ‘œμš΄ μš”μ†Œκ°€ μΆ”κ°€λœλ‹€. μ΄λ•Œ length ν”„λ‘œνΌν‹° 값은 μžλ™ κ°±μ‹±λœλ‹€.

cosnt arr = [0];

// λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€
arr[1] = 1;

console.log(arr); // [0, 1]
console.log(arr.length); // 2

ν˜„μž¬ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° 값보닀 큰 인덱슀둜 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ©΄ ν¬μ†Œ 배열이 λœλ‹€.

arr[100] = 100;

console.log(arr); // [0, 1, empty * 98, 100]
console.log(arr.length); // 101

이미 μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ” μš”μ†Œμ— 값을 μž¬ν• λ‹Ήν•˜λ©΄ μš”μ†Œκ°’μ΄ κ°±μ‹ λœλ‹€.

// μš”μ†Œκ°’μ˜ κ°±μ‹ 
arr[1] = 10;

console.log(arr); // [0, 10, empty * 98, 100]

μ •μˆ˜ μ΄μ™Έμ˜ 값을 인덱슀처럼 μ‚¬μš©ν•˜λ©΄ μš”μ†Œκ°€ μƒμ„±λ˜λŠ” 것이 μ•„λ‹ˆλΌ ν”„λ‘œνΌν‹°κ°€ μƒμ„±λœλ‹€. μ΄λ•Œ μΆ”κ°€λœ ν”„λ‘œνΌν‹°λŠ” length ν”„λ‘œνΌν‹° 값에 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

const arr = [];

// λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€
arr[0] = 1;
arr['1'] = 2;

// ν”„λ‘œνΌν‹° μΆ”κ°€
arr['foo'] = 3;
arr.bar = 4;
arr[1.1] = 5;
arr[-1] = 6;

console.log(arr); // [1, 2, foo: 3, bar: 4, '1.1': 5, '-1': 6]

// ν”„λ‘œνΌν‹°λŠ” length 영ν–₯을 주지 μ•ŠλŠ”λ‹€.
console.log(arr.length); // 2

7. λ°°μ—΄ μš”μ†Œμ˜ μ‚­μ œ

배열은 사싀 객체이기 λ•Œλ¬Έμ— λ°°μ—΄μ˜ νŠΉμ • μš”μ†Œλ₯Ό μ‚­μ œν•˜κΈ° μœ„ν•΄ delete μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

const arr = [1, 2, 3];

// λ°°μ—΄ μš”μ†Œμ˜ μ‚­μ œ
delete arr[1];
console.log(arr); // [1, empty, 3]

// length ν”„λ‘œνΌν‹°μ— 영ν–₯을 주지 μ•ŠλŠ”λ‹€. 즉, ν¬μ†Œ 배열이 λœλ‹€.
console.log(arr.length); // 3

delete μ—°μ‚°μžλŠ” ν¬μ†Œ 배열을 λ§Œλ“œλ―€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

ν¬μ†Œ 배열을 λ§Œλ“€μ§€ μ•ŠμœΌλ©΄μ„œ λ°°μ—΄μ˜ νŠΉμ • μš”μ†Œλ₯Ό μ™„μ „νžˆ μ‚­μ œν•˜λ €λ©΄ Array.prototype.splice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

const arr = [1, 2, 3];

// Array.prototype.splice(μ‚­μ œλ₯Ό μ‹œμž‘ν•  인덱슀, μ‚­μ œν•  μš”μ†Œ 수)
// arr[1]λΆ€ν„° 1개의 μš”μ†Œλ₯Ό 제거
arr.splice(1, 1);
console.log(arr); // [1, 3]

8. λ°°μ—΄ λ©”μ„œλ“œ

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 배열을 λ‹€λ£° λ•Œ μœ μš©ν•œ λ‹€μ–‘ν•œ 빌트인 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

Array μƒμ„±μž ν•¨μˆ˜λŠ” 정적 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λ©°, λ°°μ—΄ 객체의 ν”„λ‘œν† νƒ€μž…μΈ Array.prototype은 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

λ°°μ—΄ λ©”μ„œλ“œλŠ” 결과물을 λ°˜ν™˜ν•˜λŠ” νŒ¨ν„΄μ΄ 두 κ°€μ§€μ΄λ―€λ‘œ μ£Όμ˜κ°€ ν•„μš”ν•˜λ‹€. **λ°°μ—΄μ—λŠ” 원본 λ°°μ—΄(λ°°μ—΄ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄, 즉 λ°°μ—΄ λ©”μ„œλ“œμ˜ κ΅¬ν˜„μ²΄ λ‚΄λΆ€μ—μ„œ thisκ°€ κ°€λ¦¬ν‚€λŠ” 객체)을 직접 λ³€κ²½ν•˜λŠ” λ©”μ„œλ“œμ™€ 원본 배열을 직접 λ³€κ²½ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œκ°€ μžˆλ‹€.

const arr = [1];

// push λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄(arr)을 직접 λ³€κ²½ν•œλ‹€.
arr.push(2);
console.log(arr); // [1, 2]

// concat λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄(arr)을 직접 λ³€κ²½ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
const result = arr.concat(3);
console.log(arr); // [1, 2]
console.log(result); // [1, 2, 3]

가급적 원본 배열을 직접 λ³€κ²½ν•˜μ§€ μ•ˆν” λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 편이 μ’‹λ‹€.

8-1. Array.isArray

Array.isArrayλŠ” Array μƒμ„±μž ν•¨μˆ˜μ˜ 정적 λ©”μ„œλ“œλ‹€.

Array.isArray λ©”μ„œλ“œλŠ” μ „λ‹¬λœ μΈμˆ˜κ°€ 배열이면 true 배열이 μ•„λ‹ˆλ©΄ falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

// true
Array.isArray([]);
Array.isArray([1, 2]);
Array.isArray(new Array());

// false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(1);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ 0: 1, length: 1 })

8-2. Array.prototype.indexOf

indexOf λ©”μ„œλ“œ λŠ” 원본 λ°°μ—΄μ—μ„œ 인수둜 μ „λ‹¬λœ μš”μ†Œλ₯Ό κ²€μƒ‰ν•˜μ—¬ 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.

  • 원본 배열에 인수둜 μ „λ‹¬ν•œ μš”μ†Œμ™€ μ€‘λ³΅λ˜λŠ” μš”μ†Œκ°€ μ—¬λŸ¬κ°œ μžˆλ‹€λ©΄ 첫 번째둜 κ²€μƒ‰λœ μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • 원본 배열에 인수둜 μ „λ‹¬ν•œ μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ -1을 λ°˜ν™˜ν•œλ‹€.
const arr = [1, 2, 2, 3];

// λ°°μ—΄ arrμ—μ„œ μš”μ†Œ 2λ₯Ό κ²€μƒ‰ν•˜μ—¬ 첫 번째둜 κ²€μƒ‰λœ μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.
arr.indexOf(2); // -> 1
// λ°°μ—΄ arr에 μš”μ†Œ 4κ°€ μ—†μœΌλ―€λ‘œ -1을 λ°˜ν™˜ν•œλ‹€.
arr.indexOf(4): // -> -1
// 두 번째 μΈμˆ˜λŠ” 검색을 μ‹œμž‘ν•  μΈλ±μŠ€λ‹€. 두 번째 인수λ₯Ό μƒλž΅ν•˜λ©΄ μ²˜μŒλΆ€ν„° κ²€μƒ‰ν•œλ‹€.
arr.indexOf(2, 2); // -> 2

indexOf λ©”μ„œλ“œλŠ” 배열에 νŠΉμ • μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ 확인할 λ•Œ μœ μš©ν•˜λ‹€.

const foods = ['apple', 'banana', 'orange'];

// foods 배열에 'orange' μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
if (foods.indexOf('orange') === -1) {
  // foods 배열에 'orange' μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 'orange' μš”μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€.
  foods.push('orange');
}

console.log(foods); // ["apple", "banana", "orange"]

indexOf λ©”μ„œλ“œ λŒ€μ‹  ES7μ—μ„œ λ„μž…λœ Array.prototype.includes λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 가독성이 μ’‹λ‹€.

const foods = ['apple', 'banana', 'orange'];

// foods 배열에 'orange' μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
if (!foods.includes('orange')) {
  // foods 배열에 'orange' μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 'orange' μš”μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€.
  foods.push('orange');
}

console.log(foods); // ["apple", "banana", "orange"]

Array.prototype.push

push λ©”μ„œλ“œλŠ” 인수둜 전달받은 λͺ¨λ“  값을 원본 λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν˜Ή λ³€κ²½λœ length ν”„λ‘œνΌν‹°κ°’μ„ λ°˜ν™˜ν•œλ‹€. push λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.

const arr = [1, 2];

// 인수둜 전달받은 λͺ¨λ“  값을 원본 λ°°μ—΄ arr의 λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν˜Ή λ³€κ²½λœ length 값을 λ°˜ν™˜ν•œλ‹€.
let result = arr.push(3,4);
console.log(result); // 4

// push λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [1, 2, 3, 4]

λ§ˆμ§€λ§‰ μš”μ†Œμ— μΆ”κ°€ν•  μš”μ†Œκ°€ ν•˜λ‚˜λΏμ΄λΌλ©΄ push λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  length ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 λΉ λ₯΄λ‹€.

const arr = [1, 2];

// arr.push(3)κ³Ό λ™μΌν•œ 처리λ₯Ό ν•œλ‹€. 이 방법이 push λ©”μ„œλ“œλ³΄λ‹€ λΉ λ₯΄λ‹€.
arr[arr.length] = 3;
console.log(arr); // [1, 2, 3]

push λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλ‹€. λ”°λΌμ„œ push λ©”μ„œλ“œλ³΄λ‹€λŠ” ES6의 μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•˜λŠ” 편이 μ’‹λ‹€.

const arr = [1, 2];

// ES6 μŠ€ν”„λ ˆλ“œ 문법
cosnt newArr = [...arr, 3];
console.log(newArr); // [1, 2, 3]

8-4. Array.prototype.pop

pop λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄μ—μ„œ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  μ œκ±°ν•œ μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€. pop λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.

cosnt arr = [1, 2];

// 원본 λ°°μ—΄μ—μ„œ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  μ œκ±°ν•œ μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.
let result = arr.pop(); 
console.log(result); // 2

// popλ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [1]

8-5. Array.prototype.unshift

unshift λ©”μ„œλ“œλŠ” 인수둜 전달받은 λͺ¨λ“  값을 원본 λ°°μ—΄μ˜ 선두에 μš”μ†Œλ‘œ μΆ”κ°€ν•˜κ³  λ³€κ²½λœ length ν”„λ‘œνΌν‹° 값을 λ°”ν™˜ν•œλ‹€. unshift λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.

const arr = [1, 2];

// 인수둜 전달받은 λͺ¨λ“  값을 원본 λ°°μ—΄μ˜ 선두에 μš”μ†Œλ‘œ μΆ”κ°€ν•˜κ³  λ³€κ²½λœ length 값을 λ°˜ν™˜ν•œλ‹€.
let result = arr.unshift(3, 4);
console.log(result); // 4

// unshift λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [3,4,1,2]

unshift λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλ‹€. λ”°λΌμ„œ unshift λ©”μ„œλ“œλ³΄λ‹€λŠ” ES6의 μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•˜λŠ” 편이 μ’‹λ‹€.

const arr = [1, 2];

// ES6 μŠ€ν”„λ ˆλ“œ 문법
const newArr = [3, ...arr];
console.log(newArr); // [3, 1, 2]

8-6. Array.prototype.shift

shift λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄μ—μ„œ 첫 번째 μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜ν•œλ‹€. shift λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.

const arr = [1, 2];

// 원본 λ°°μ—΄μ—μ„œ 첫 번째 μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  μ œκ±°ν•œ μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.
let result = arr.shift();
console.log(result); // 1

// shift λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [2]

8-7. Array.prototype.concat

concat λ©”μ„œλ“œ 인수둜 μ „λ‹¬λœ κ°’(λ°°μ—΄ λ˜λŠ” μ›μ‹œκ°’)을 원본 λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν•œ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€. 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

const arr1 = [1, 2];
const arr2 = [3, 4];

// λ°°μ—΄ arr2λ₯Ό 원본 λ°°μ—΄ arr1의 λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν•œ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
// 인수둜 μ „λ‹¬ν•œ 값이 배열인 경우 배열을 ν•΄μ²΄ν•˜μ—¬ μƒˆλ‘œμš΄ λ°°μ—΄μ˜ μš”μ†Œλ‘œ μΆ”κ°€ν•œλ‹€.
let result = arr1.concat(arr2);
console.log(result); // [1, 2, 3, 4]

// 숫자λ₯Ό 원본 λ°°μ—΄ arr1의 λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν•œ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
result = arr1.concat(3);
console.log(result); // [1, 2, 3]

// λ°°μ—΄ arr2와 숫자λ₯Ό 원본 λ°°μ—΄ arr1의 λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν•œ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
result = arr1.concat(arr2, 5);
console.log(result); // [1, 2, 3, 4, 5]

// 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.
console.log(arr1); // [1, 2];

push와 unshift λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  경우 원본 배열을 λ°˜λ“œμ‹œ λ³€μˆ˜μ— μ €μž₯ν•΄ 두어야 ν•˜λ©° concat λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  경우 λ°˜ν™˜κ°’μ„ λ°˜λ“œμ‹œ λ³€μˆ˜μ— ν• λ‹Ήλ°›μ•„μ•Ό ν•œλ‹€.

const arr1 = [3, 4];

// unshift λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
// λ”°λΌμ„œ 원본 배열을 λ³€μˆ˜μ— μ €μž₯ν•΄ 두지 μ•ŠμœΌλ©΄ λ³€κ²½λœ 배열을 μ‚¬μš©ν•  수 μ—†λ‹€.
arr1.unshift(1, 2);
// unshift λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  경우 원본 배열을 λ°˜λ“œμ‹œ λ³€μˆ˜μ— μ €μž₯ν•΄ 두어야 κ²°κ³Όλ₯Ό 확인할 수 μžˆλ‹€.
console.log(arr1); // [1, 2, 3, 4]

// push λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
// λ”°λΌμ„œ 원본 배열을 λ³€μˆ˜μ— μ €μž₯ν•΄ 두지 μ•ŠμœΌλ©΄ λ³€κ²½λœ 배열을 μ‚¬μš©ν•  수 μ—†λ‹€.
arr1.push(5, 6);
// push λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  경우 원본 배열을 λ°˜λ“œμ‹œ λ³€μˆ˜μ— μ €μž₯ν•΄ 두어야 κ²°κ³Όλ₯Ό 확인할 수 μžˆλ‹€.
console.log(arr1); // [1, 2, 3, 4, 5, 6]

// unshift와 push λ©”μ„œλ“œλŠ” concat λ©”μ„œλ“œλ‘œ λŒ€μ²΄ν•  수 μžˆλ‹€.
const arr2 = [3, 4];

// concat λ©”μ„œλ“œλŠ” 원본 배열을 λ³€κ²½ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
// arr1.unshift(1, 2)λ₯Ό λ‹€μŒκ³Ό 같이 λŒ€μ²΄ν•  수 μžˆλ‹€.
let result = [1, 2].concat(arr2);
console.log(result); // [1, 2, 3, 4]

// arr1.push(5, 6)λ₯Ό λ‹€μŒκ³Ό 같이 λŒ€μ²΄ν•  수 μžˆλ‹€.
result = result.concat(5, 6);
console.log(result); // [1, 2, 3, 4, 5, 6]

인수둜 전달받은 값이 배열인 경우 push와 unshift λ©”μ„œλ“œλŠ” 배열을 κ·ΈλŒ€λ‘œ 원본 λ°°μ—΄μ˜ λ§ˆμ§€λ§‰/첫 번째 μš”μ†Œλ‘œ μΆ”κ°€νžˆμžλ§Œ concat λ©”μ„œλ“œλŠ” 인수둜 전달받은 λ°°μ˜μ„ ν•΄μ²΄ν•˜μ—¬ μƒˆλ‘œμš΄ λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν•œλ‹€.

const arr = [3, 4];

// unshift와 push λ©”μ„œλ“œλŠ” 인수둜 전달받은 배열을 κ·ΈλŒ€λ‘œ 원본 λ°°μ—΄μ˜ μš”μ†Œλ‘œ μΆ”κ°€ν•œλ‹€
arr.unshift([1, 2]);
arr.push([5, 6]);
console.log(arr); // [[1, 2], 3, 4,[5, 6]]

// concat λ©”μ„œλ“œλŠ” 인수둜 전달받은 배열을 ν•΄μ²΄ν•˜μ—¬ μƒˆλ‘œμš΄ λ°°μ—΄μ˜ μš”μ†Œλ‘œ μΆ”κ°€ν•œλ‹€
let result = [1, 2].concat([3, 4]);
result = result.concat([5, 6]);

console.log(result); // [1, 2, 3, 4, 5, 6]

concat λ©”μ„œλ“œλŠ” ES6의 μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μœΌλ‘œ λŒ€μ²΄ν•  수 μžˆλ‹€. ES6의 μŠ€ν”„λ ˆλ“œ 문법을 일관성 있게 μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯.

let result = [1, 2].concat([3, 4]);
console.log(result); // [1, 2, 3, 4]

// concat λ©”μ„œλ“œλŠ” ES6의 μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μœΌλ‘œ λŒ€μ²΄ν•  수 μžˆλ‹€.
result = [...[1, 2], ...[3, 4]];
console.log(result); // [1, 2, 3, 4]

8-8. Array.prototype.splice

원본 λ°°μ—΄μ˜ 쀑간에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ 쀑간에 μžˆλŠ” μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ” 경우 splice λ©”μ„œλ“œλ₯Ό λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

splice λ©”μ„œλ“œλŠ” 3개의 λ§€κ°œλ³€μˆ˜κ°€ 있으며 원본 배열을 직접 λ³€κ²½ν•œλ‹€.

1️⃣ start

원본 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•˜κΈ° μ‹œμž‘ν•  μΈλ±μŠ€λ‹€. start만 μ§€μ •ν•˜λ©΄ startλΆ€ν„° λͺ¨λ“  μš”μ†Œλ₯Ό 제거. 음수인 경우 λ°°μ—˜μ˜ λμ—μ„œμ˜ 인덱슀λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. λ§Œμ•½ startκ°€ -1이면 λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό 가맄고 -n이면 λ§ˆμ§€λ§‰μ—μ„œ n번째 μš”μ†Œλ₯Ό 가리킨닀.

2️⃣ deleteCount

원본 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•˜κΈ° μ‹œμž‘ν•  인덱슀인 startλΆ€ν„° μ œκ±°ν•  μš”μ†Œμ˜ κ°œμˆ˜λ‹€. deleteCountκ°€ 0인 경우 μ•„λ¬΄λŸ° μš”μ†Œλ„ μ œκ±°λ˜μ§€ μ•ŠλŠ”λ‹€.(μ˜΅μ…˜)

3️⃣items

μ œκ±°ν•œ μœ„μΉ˜μ— μ‚½μž…ν•  μš”μ†Œλ“€μ˜ λͺ©λ‘μ΄λ‹€. μƒλž΅ν•  경우 원본 λ°°μ—΄μ—μ„œ μš”μ†Œλ“€μ„ μ œκ²‹κΈ°λ§Œ ν•œλ‹€(μ˜΅μ…˜)

const arr = [1, 2, 3, 4];

// 원본 λ°°μ—΄μ˜ 인덱슀 1λΆ€ν„° 2개의 μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  κ·Έ μžλ¦¬μ— μƒˆλ‘œμš΄ μš”μ†Œ 20, 30을 μ‚½μž…ν•œλ‹€.
const result = arr.splice(1, 2, 20, 30);

// μ œκ±°ν•œ μš”μ†Œκ°€ λ°°μ—΄λ‘œ λ°˜ν™˜λœλ‹€.
console.log(result); // [2, 3]
// splice λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [1, 20, 30, 4]
const arr = [1, 2, 3, 4];

// 원본 λ°°μ—΄μ˜ 인덱슀 1λΆ€ν„° 0개의 μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  κ·Έ μžλ¦¬μ— μƒˆλ‘œμš΄ μš”μ†Œ 100을 μ‚½μž…ν•œλ‹€.
const result = arr.splice(1, 0, 100);

// 원본 배열이 λ³€κ²½λœλ‹€.
console.log(arr); // [1, 100, 2, 3, 4]
// μ œκ±°ν•œ μš”μ†Œκ°€ λ°°μ—΄λ‘œ λ°˜ν™˜λœλ‹€.
console.log(result); // []
const arr = [1, 2, 3, 4];

// 원본 λ°°μ—΄μ˜ 인덱슀 1λΆ€ν„° 2개의 μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€.
const result = arr.splice(1, 2);

// 원본 배열이 λ³€κ²½λœλ‹€.
console.log(arr); // [1, 4]
// μ œκ±°ν•œ μš”μ†Œκ°€ λ°°μ—΄λ‘œ λ°˜ν™˜λœλ‹€.
console.log(result); // [2, 3]
const arr = [1, 2, 3, 4];

// 원본 λ°°μ—΄μ˜ 인덱슀 1λΆ€ν„° λͺ¨λ“  μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€.
const result = arr.splice(1);

// 원본 배열이 λ³€κ²½λœλ‹€.
console.log(arr); // [1]
// μ œκ±°ν•œ μš”μ†Œκ°€ λ°°μ—΄λ‘œ λ°˜ν™˜λœλ‹€.
console.log(result); // [2, 3, 4]

λ°°μ—΄μ—μ„œ νŠΉμ • μš”μ†Œλ₯Ό μ œκ±°ν•˜λ €λ©΄ indexof λ©”μ„œλ“œλ₯Ό 톡해 νŠΉμ • μš”μ†Œμ˜ 인덱슀λ₯Ό μ·¨λ“ν•œ λ‹€μŒ splice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

const arr = [1, 2, 3, 1, 2];

// λ°°μ—΄ arrayμ—μ„œ item μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. item μš”μ†Œκ°€ μ—¬λŸ¬ 개 μ‘΄μž¬ν•˜λ©΄ 첫 번째 μš”μ†Œλ§Œ μ œκ±°ν•œλ‹€.
function remove(array, item) {
  // μ œκ±°ν•  item μš”μ†Œμ˜ 인덱슀λ₯Ό μ·¨λ“ν•œλ‹€.
  const index = array.indexOf(item);
  
  // μ œκ±°ν•  item μš”μ†Œλ§Œ μžˆλ‹€λ©΄ μ œκ±°ν•œλ‹€.
  if(index !== -1) array.splice(index, 1);
  
  return array;
}

console.log(remove(arr, 2)); // [1, 3, 1, 2]
console.log(remove(arr, 10)); // [1, 3, 1, 2]

filter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • μš”μ†Œλ₯Ό λͺ¨λ‘ μ œκ±°ν•  μˆ˜λ„ μžˆλ‹€.(쀑볡 포함)

const arr = [1, 2, 3, 1, 2];

// λ°°μ—΄ arrayμ—μ„œ λͺ¨λ“  item μš”μ†Œλ₯Ό μ œκ±΄ν•œλ‹€.
function removeAll(array, item) {
  return array.filter(v => v !== item);
}

console.log(removeAll(arr, 2)); // [1, 3, 1]

8-9. Array.prototype.slice

slice λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬λœ λ²”μœ„μ˜ μš”μ†Œλ“€μ„ λ³΅μ‚¬ν•˜μ—¬ λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€. 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

slice λ©”μ„œλ“œλŠ” 두 개의 λ§€κ°œλ³€μˆ˜λ₯Ό κ°–λŠ”λ‹€.

1️⃣ start

볡사λ₯Ό μ‹œμž‘ν•  μΈλ±μŠ€λ‹€. 음수인 경우 λ°°μ—΄μ˜ λμ—μ„œμ˜ 인덱슀λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 예λ₯Ό λ“€μ–΄, slice(-2)λŠ” λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ 두 개의 μš”μ†Œλ₯Ό λ³΅μ‚¬ν•˜μ—¬ λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.

2️⃣ end

볡사λ₯Ό μ’…λ£Œν•  μΈλ±μŠ€λ‹€ 이 μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” μš”μ†ŒλŠ” λ³΅μ‚¬λ˜μ§€ μ•ŠλŠ”λ‹€ endλŠ” μƒλž΅κ°€λŠ₯ν•˜λ©° μƒλž΅ μ‹œ 기본값은 length ν”„λ‘œνΌν‹° 값이닀.

const arr = [1, 2, 3];

// arr[0]λΆ€ν„° arr[1] 이전(arr[1] 미포함)κΉŒμ§€ λ³΅μ‚¬ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
arr.slice(0, 1); // -> [1]

// arr[1]λΆ€ν„° arr[2] 이전(arr[2] 미포함)κΉŒμ§€ λ³΅μ‚¬ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
arr.slice(1, 2); // -> [2]

// 원본은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.
console.log(arr); // [1, 2, 3]

// arr[1]λΆ€ν„° μ΄ν›„μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό λ³΅μ‚¬ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
arr.slice(1); // -> [2, 3]

// λ°°μ—΄μ˜ λμ—μ„œλΆ€ν„° μš”μ†Œλ₯Ό ν•œ 개 λ³΅μ‚¬ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
arr.slice(-1); // -> [3]

// λ°°μ—΄μ˜ λμ—μ„œλΆ€ν„° μš”μ†Œλ₯Ό 두 개 λ³΅μ‚¬ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
arr.slice(-2); // -> [2, 3]

slice λ©”μ„œλ“œμ˜ 인수λ₯Ό λͺ¨λ‘ μƒλž΅ν•˜λ©΄ 원본 λ°°μ—΄μ˜ 볡사본을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

const arr = [1, 2, 3];

// 인수λ₯Ό λͺ¨λ‘ μƒλž΅ν•˜λ©΄ 원본 λ°°μ—΄μ˜ 볡사본을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
const copy = arr.slice();
console.log(copy); // [1, 2, 3]
console.log(copy === arr); // false

μ΄λ•Œ μƒμ„±λœ 볡사본은 얕은 볡사λ₯Ό 톡해 μƒμ„±λœλ‹€.

8-10. Array.prototype.join

join λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œ ν›„ 인수둜 전달받은 λ¬Έμžμ—΄, 즉 κ΅¬λΆ„μžλ‘œ μ—°κ²°ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€. κ΅¬λΆ„μžλŠ” μƒλž΅ κ°€λŠ₯ν•˜λ©° κΈ°λ³Έ κ΅¬λΆ„μžλŠ” 콀마(,)λ‹€.

const arr = [1, 2, 3, 4];

// κΈ°λ³Έ κ΅¬λΆ„μžλŠ” μ½€λ§ˆλ‹€.
// 원본 λ°°μ—΄ arr의 λͺ¨λ“  μš”μ†Œλ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œ ν›„ κΈ°λ³Έ κ΅¬λΆ„μžλ‘œ μ—°κ²°ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
arr.join(); // -> '1,2,3,4'

// 원본 λ°°μ—΄ arr의 λͺ¨λ“  μš”μ†Œλ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œ ν›„, 빈 λ¬Έμžμ—΄λ‘œ μ—°κ²°ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
arr.join('') // -> '1234'

// 원본 λ°°μ—΄ arr의 λͺ¨λ“  μš”μ†Œλ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œ ν›„, κ΅¬λΆ„μž ':'둜 μ—°κ²°ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
arr.join(':'); // -> '1:2:3:4'

8-11. Array.prototype.reverse

reverse λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄μ˜ μˆœμ„œλ₯Ό λ°˜λŒ€λ‘œ λ’€μ§‘λŠ”λ‹€. μ΄λ•Œ 원본 배열이 λ³€κ²½λ˜λ©° λ°˜ν™˜κ°’μ€ λ³€κ²½λœ 배열이닀.

cosnt arr = [1, 2, 3];
const result = arr.reverse();

// reverse λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [3, 2, 1]
// λ°˜ν™˜κ°’μ€ λ³€κ²½λœ 배열이닀.
console.log(result);; // [3, 2, 1]

8-12. Array.prototype.fill

ES6μ—μ„œ λ„μž…λœ fill λ©”μ„œλ“œλŠ” 인수둜 전달받은 값을 λ°°μ—΄μ˜ μ²˜μŒλΆ€ν„° λκΉŒμ§€ μš”μ†Œλ‘œ μ±„μš΄λ‹€. μ΄λ•Œ 원본 배열이 λ³€κ²½λœλ‹€.

const arr = [1, 2, 3];
// 인수둜 전달받은 κ°’ 0을 λ°°μ—΄μ˜ μ²˜μŒλΆ€ν„° λκΉŒμ§€ μš”μ†Œλ‘œ μ±„μš΄λ‹€.
arr.fill(0);

// fill λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [0, 0, 0]

두 번째 인수둜 μš”μ†Œ μ±„μš°κΈ°λ₯Ό μ‹œμž‘ν•  인덱슀λ₯Ό 전달할 수 μžˆλ‹€.

const arr = [1, 2, 3];

// 인수둜 전달받은 κ°’ 0을 λ°°μ—΄μ˜ 인덱슀 1λΆ€ν„° λκΉŒμ§€ μš”μ†Œλ‘œ μ±„μš΄λ‹€.
arr(0, 1); 

// fill λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [1, 0, 0]

μ„Έ 번째 인수둜 μš”μ†Œ μ±„μš°κΈ°λ₯Ό 멈좜 인덱슀λ₯Ό 전달할 수 μžˆλ‹€.

const arr = [1, 2, 3, 4, 5];

// 인수둜 전달받은 κ°’ 0을 λ°°μ—΄μ˜ 인덱슀 1λΆ€ν„° 3 이전(인덱슀 3 미포함)κΉŒμ§€ μš”μ†Œλ‘œ μ±„μš΄λ‹€.
arr.fill(0, 1, 3);

// fill λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [1, 0, 0, 4, 5]

fill λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 배열을 μƒμ„±ν•˜λ©΄μ„œ νŠΉμ • κ°’μœΌλ‘œ μš”μ†Œλ₯Ό μ±„μšΈ 수 μžˆλ‹€.

const arr = new Array(3);
console.log(arr); // [empty * 3]

// 인수둜 전달받은 κ°’ 1을 λ°°μ—΄μ˜ μ²˜μŒλΆ€ν„° λκΉŒμ§€ μš”μ†Œλ‘œ μ±„μš΄λ‹€.
const result = arr.fill(1);

// fill λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(arr); // [1, 1, 1]

// fill λ©”μ„œλ“œλŠ” λ³€κ²½λœ 원본 배열을 λ°˜ν™˜ν•œλ‹€.
console.log(result); // [1, 1, 1]

8-13. Array.prototype.includes

ES7μ—μ„œ λ„μž…λœ includes λ©”μ„œλ“œλŠ” λ°°μ—΄ 내에 νŠΉμ • μš”μ†Œκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜μ—¬ true λ˜λŠ” fasleλ₯Ό λ°˜ν™˜ν•œλ‹€.

const arr = [1, 2, 3];

// 배열에 μš”μ†Œ 2κ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
arr.includes(2); // -> true

// 배열에 μš”μ†Œ 100이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
arr.includes(100); // -> false

두 번째 인수둜 검색을 μ‹œμž‘ν•  인덱슀λ₯Ό 전달할 수 있으며 기본값은 0이닀.

const arr = [1, 2, 3];

// 배열에 μš”μ†Œ 1이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 인덱슀 1λΆ€ν„° ν™•μΈν•œλ‹€.
arr.includes(1, 1); // -> false

// 배열에 μš”μ†Œ 3이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 인덱슀 2(arr.length - 1)λΆ€ν„° ν™•μΈν•œλ‹€.
arr.includes(3, -1); // -> true

indexOf λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬λ„ 배열내에 νŠΉμ • μš”μ†Œκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인 κ°€λŠ₯ν•˜μ§€λ§Œ λ°˜ν™˜κ°’μ΄ -1인지도 ν™•μΈν•΄μ•„ν•˜κ³  λ°°μ—΄ NaN이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인할 수 μ—†λ‹€λŠ” λ¬Έμ œκ°€ μžˆλ‹€.

[NaN].indexOf(NaN) !== -1; // -> false
[NaN].includes(NaN);       // -> true

8-14. Array.prototype.flat

ES10 μ—μ„œ λ„μž…λœ flat λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬ν•œ 깊이만큼 μž¬κ·€μ μœΌλ‘œ 배열을 ν‰νƒ„ν™”ν•œλ‹€.

[1, [2, 3, 4, 5]].flat(); // -> [1, 2, 3, 4, 5]
// 쀑첩 배열을 ν‰νƒ„ν™”ν•˜κΈ° μœ„ν•œ 깊이 κ°’μ˜ 기본값은 1이닀.
[1, [2, [3, [4]]]].flat();  // -> [1, 2, [3, [4]]]
[1, [2, [3, [4]]]].flat(1); // -> [1, 2, [3, [4]]]

// 쀑첩 배열을 ν‰νƒ„ν™”ν•˜κΈ° μœ„ν•œ 깊이 값을 2둜 μ§€μ •ν•˜μ—¬ 2단계 κΉŠμ΄κΉŒμ§€ ν‰νƒ„ν™”ν•œλ‹€.
[1, [2, [3, [4]]]].flat(2); // -> [1, 2, 3, [4]]
// 2번 ν‰νƒ„ν™”ν•œ 것과 λ™μΌν•˜λ‹€.
[1, [2, [3, [4]]]].flat().flat(); // -> [1, 2, 3, [4]]

// 쀑첩 배열을 ν‰νƒ„ν™”ν•˜κΈ° μœ„ν•œ 깊이 값을 Infinity둜 μ§€μ •ν•˜μ—¬ 쀑첩 λ°°μ—΄ λͺ¨λ‘λ₯Ό ν‰νƒ„ν™”ν•œλ‹€.
[1, [2, [3, [4]]]].flat(Infinity); // -> [1, 2, 3, 4]

9. λ°°μ—΄ κ³ μ°¨ ν•¨μˆ˜

κ³ μ°¨ ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό 인수둜 μ „λ‹¬λ°›κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체이미둜 ν•¨μˆ˜λ₯Ό κ°’μ²˜λŸΌ 인수둜 전달할 수 있으며 λ°˜ν™˜ν•  μˆ˜λ„ μžˆλ‹€.

κ³ μ°¨ ν•¨μˆ˜λŠ” μ™ΈλΆ€ μƒνƒœμ˜ λ³€κ²½μ΄λ‚˜ κ°€λ³€ 데이터λ₯Ό ν”Όν•˜κ³  λΆˆλ³€μ„±μ„ 지ν–₯ν•˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— κΈ°λ°˜μ„ 두고 μžˆλ‹€.

9-1. Array.prototype.sort

sort λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ •λ ¬ν•œλ‹€. 원본 배열을 직접 λ³€κ²½ν•˜λ©° μ •λ ¬λœ 배열을 λ°˜ν™˜ν•œλ‹€.

sort λ©”μ„œλ“œλŠ” 기본적으둜 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μš”μ†Œλ₯Ό μ •λ ¬ν•œλ‹€.

const fruits = ['Banana', 'Orange', 'Apple'];

// μ˜€λ¦„μ°¨μˆœ(ascending) μ •λ ¬
fruits.sort();

// sort λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(fruits); // ['Apple', 'Banana', 'Orange']
const fruits = ['λ°”λ‚˜λ‚˜', 'μ˜€λ Œμ§€', 'μ• ν”Œ'];

// μ˜€λ¦„μ°¨μˆœ(ascending) μ •λ ¬
fruits.sort();

// sort λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(fruits); // ['λ°”λ‚˜λ‚˜', '사과', 'μ˜€λ Œμ§€']

λ‚΄λ¦¬λ§ˆμˆœμœΌλ‘œ μš”μ†Œλ₯Ό μ •λ ¬ν•˜λ €λ©΄ sort λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„ reverse λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œμ˜ μˆœμ„œλ₯Ό λ’€μ§‘λŠ”λ‹€.

const fruits = ['Banana', 'Orange', 'Apple'];

// μ˜€λ¦„μ°¨μˆœ(ascending) μ •λ ¬
fruits.sort();

// sort λ©”μ„œλ“œλŠ” 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(fruits); // ['Apple', 'Banana', 'Orange']

// λ‚΄λ¦Όμ°¨μˆœ(descending) μ •λ ¬
fruits.reverse();

// reverse λ©”μ„œλ“œλ‘œ 원본 배열을 직접 λ³€κ²½ν•œλ‹€.
console.log(fruits); // ['Orange', 'Banana', 'Apple']

숫자 μš”μ†Œλ‘œ 이루어진 배열을 μ •λ ¬ν•  λ•ŒλŠ” μ£Όμ˜κ°€ ν•„μš”ν•˜λ‹€.

const points = [40, 100, 1, 5, 2, 25, 10];

points.sort();

// 숫자 μš”μ†Œλ“€λ‘œ 이루어진 배열은 μ˜λ„ν•œλŒ€λ‘œ μ •λ ¬λ˜μ§€ μ•ŠλŠ”λ‹€.
console.log(points);

sort λ©”μ„œλ“œμ˜ κΈ°λ³Έ μ •λ ¬ μˆœμ„œλŠ” μœ λ‹ˆμ½”λ“œ μ½”λ“œ 포인트의 μˆœμ„œλ₯Ό λ”°λ₯Έλ‹€. 숫자 νƒ€μž…μ΄λΌ 할지라도 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μΌμ‹œμ μœΌλ‘œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œ ν›„ μœ λ‹ˆμ½”λ“œ μ½”λ“œ ν¬μΈν„°μ˜ μˆœμ„œλ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•œλ‹€.

λ”°λΌμ„œ μˆ«μžμš”μ†Œλ₯Ό μ •λ ¬ν•  λ•ŒλŠ” sort λ©”μ„œλ“œμ— μ •λ ¬ μˆœμ„œλ₯Ό μ •μ˜ν•˜λŠ” 비ꡐ ν•¨μˆ˜λ₯Ό 인수둜 전달해야 ν•œλ‹€.

비ꡐ ν•¨μˆ˜λŠ” μ–‘μˆ˜λ‚˜ 음수 λ˜λŠ” 0을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. 비ꡐ ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 0보닀 μž‘μœΌλ©΄ λΉ„κ΅ν•¨μˆ˜μ˜ 첫 번째 인수λ₯Ό μš°μ„ ν•˜μ—¬ μ •λ ¬ν•˜κ³  0이면 μ •λ ¬ν•˜μ§€ μ•ŠμœΌλ©° 0보닀 크면 λ‘λ²ˆμ§Έ 인수λ₯Ό μš°μ„ ν•˜μ•Ό μ •λ ¬ν•œλ‹€.

const points = [40, 100, 1, 5, 2, 25, 10];

// 숫자 λ°°μ—΄μ˜ μ˜€λ¦„μ°¨μˆœ μ •λ ¬. 비ꡐ ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 0보닀 μž‘μœΌλ©΄ aλ₯Ό μš°μ„ ν•˜μ—¬ μ •λ ¬ν•œλ‹€.
points.sort((a, b) => a - b);
console.log(points); // [1, 2, 5, 10, 25, 40, 100]

// 숫자 λ°°μ—΄μ—μ„œ μ΅œμ†Œ/μ΅œλŒ“κ°’ 취득
console.log(points[0], points[points.length - 1]); // 1 100

// 숫자 λ°°μ—΄μ˜ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬. 비ꡐ ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 0보닀 μž‘μœΌλ©΄ bλ₯Ό μš°μ„ ν•˜μ—¬ μ •λ ¬ν•œλ‹€.
points.sort((a,b) => b - a);
console.log(points); // [100, 40, 25, 10, 5, 2, 1]

// 숫자 λ°°μ—΄μ—μ„œ μ΅œμ†Œ/μ΅œλŒ“κ°’ 취득
console.log(points[points.length - 1], points[0]); // 1 100

객체λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μ •λ ¬ν•˜λŠ” μ˜ˆμ œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

const todos = [
  { id: 4, content: 'JavaScript' },
  { id: 1, content: 'HTML' },
  { id: 2, content: 'CSS' }
];

// 비ꡐ ν•¨μˆ˜. λ§€κ°œλ³€μˆ˜ keyλŠ” ν”„λ‘œνΌν‹° ν‚€λ‹€.
function compare(key) {
  // ν”„λ‘œνΌν‹° 값이 λ¬Έμžμ—΄μΈ 경우 - μ‚°μˆ  μ—°μ‚°μœΌλ‘œ λΉ„κ΅ν•˜λ©΄ NaN이 λ‚˜μ˜€λ―€λ‘œ 비ꡐ 연산을 μ‚¬μš©ν•œλ‹€.
  // 비ꡐ ν•¨μˆ˜λŠ” μ–‘μˆ˜/음수/0을 λ°˜ν™˜ν•˜λ©΄ λ˜λ―€λ‘œ - μ‚°μˆ  μ—°μ‚° λŒ€μ‹  비ꡐ 연산을 μ‚¬μš©ν•  수 μžˆλ‹€.
  return (a, b) => (a[key] > b[key] ? 1 : (a[key] < b[key] ? -1 : 0));
}

// idλ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬
todos.sort(compare('id'));
console.log(todos);
/*
[
  { id: 1, content: 'HTML' },
  { id: 2, content: 'CSS' },
  { id: 4, content: 'JavaScript' }
]
*/

// contentλ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬
todos.sort(compare('content'));
console.log(todos);
/*
[
  { id: 2, content: 'CSS' },
  { id: 1, content: 'HTML' },
  { id: 4, content: 'JavaScript' }
]
*/

9-2. Array.prototype.forEach

for 문은 λ°˜λ³΅μ„ μœ„ν•œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄μ•Ό ν•˜λ©° 쑰건식과 μ¦κ°μ‹μœΌλ‘œ 이루어져 μžˆμ–΄μ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ μΆ”κ°€ν•˜λŠ” 바와 λ§žμ§€ μ•ŠλŠ”λ‹€.

const numbers = [1, 2, 3];
const pows = [];

// for문으둜 λ°°μ—΄ 순회
for(let i = 0; i < numbers.length; i++) }
	pows.push(numbers[i] ** 2);
}

console.log(pows); // [1, 4, 9]

forEach λ©”μ„œλ“œλŠ” for 문을 λŒ€μ²΄ν•  수 μžˆλŠ” κ³ μ°¨ ν•¨μˆ˜λ‹€. forEach λ©”μ„œλ“œλŠ” μžμ‹ μ˜ λ‚΄λΆ€μ—μ„œ λ°˜λ³΅λ¬Έμ„ μ‹€ν–‰ν•œλ‹€.

const numbers = [1, 2, 3];
const pows = [];

// forEach λ©”μ„œλ“œλŠ” numbers λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•œλ‹€.
numbers.forEach(item => pows.push(item ** 2);
console.log(pows); // [1, 4, 9]
// forEach λ©”μ„œλ“œλŠ” 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ 3개(μš”μ†Œκ°’, 인덱슀, this)의 인수λ₯Ό μ „λ‹¬ν•œλ‹€.
[1, 2, 3].forEach((item, index, arr) => {
  console.log(`μš”μ†Œκ°’: ${item}, 인덱슀: ${index}, this:${JSON.stringify(arr)}`);
});

/*
μš”μ†Œκ°’: 1, 인덱슀: 0, this:[1,2,3]
μš”μ†Œκ°’: 2, 인덱슀: 1, this:[1,2,3]
μš”μ†Œκ°’: 3, 인덱슀: 2, this:[1,2,3]
*/

πŸ’‘ JSON.stringify λ©”μ„œλ“œ

JSON.stringify λ©”μ„œλ“œλŠ” 객체λ₯Ό JSON 포맷의 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€.

forEach λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄(forEach λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄, 즉 this)을 λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ μ½œλ°±ν•¨μˆ˜λ₯Ό 톡해 원본 배열을 λ³€κ²½ν•  수 λŠ” μžˆλ‹€.

const numbers = [1, 2, 3];

// forEach λ©”μ„œλ“œλŠ” 원본 배열을 λ³€κ²½ν•˜μ§€ μ•Šμ§€λ§Œ 콜백 ν•¨μˆ˜λ₯Ό 톡해 원본 배열을 λ³€κ²½ν•  μˆ˜λŠ” μžˆλ‹€.
// 콜백 ν•¨μˆ˜μ˜ μ„Έ 번째 λ§€κ°œλ³€μˆ˜ arr은 원본 λ°°μ—΄ numbersλ₯Ό 가리킨닀.
// λ”°λΌμ„œ 콜백 ν•¨μˆ˜μ˜ μ„Έ 번째 λ§€κ°œλ³€μˆ˜ arr을 직접 λ³€κ²½ν•˜λ©΄ 원본 λ°°μ—΄ numbersκ°€ λ³€κ²½λœλ‹€.
numbers.forEach((item, index, arr) => { arr[index] = item ** 2; });
console.log(numbers); // [1, 4, 9]

forEach λ©”μ„œλ“œμ˜ λ°˜ν™˜κ°’μ€ μ–Έμ œλ‚˜ undefinedλ‹€.

const result = [1, 2, 3].forEach(console.log);
console.log(result); // undefined

forEach λ©”μ„œλ“œμ˜ 두 번째 인수둜 forEach λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ this둜 μ‚¬μš©ν•  객체λ₯Ό 전달할 수 μžˆλ‹€.

class Numbers {
  numberArray = [];

  multiply(arr) {
    arr.forEach(function (item) {
      this.numberArray.push(item * item);
    }, this);
  }
}

const numbers = new Numbers();
numbers.multiply([1, 2, 3]);
console.log(numbers.numberArray); //[1, 4, 9]

더 λ‚˜μ€ 방법은 ES6의 ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것

class Numbers {
  numberArray = [];

  multiply(arr) {
    arr.forEach(item =>  this.numberArray.push(item * item));
  }
}

const numbers = new Numbers();
numbers.multiply([1, 2, 3]);
console.log(numbers.numberArray); // [1, 4, 9]

forEach λ©”μ„œλ“œλŠ” for 문에 λΉ„ν•΄ μ„±λŠ₯이 μ’‹μ§€λŠ” μ•Šμ§€λ§Œ 가독성은 더 μ’‹λ‹€. λ”°λΌμ„œ μš”μ†Œκ°€ λŒ€λ‹¨νžˆ λ§Žμ€ 배열을 μˆœνšŒν•˜κ±°λ‚˜ μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λŠ” λ³΅μž‘ν•œ μ½”λ“œ λ˜λŠ” 높은 μ„±λŠ₯이 ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ for λ¬Έ λŒ€μ‹  forEach λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  것을 ꢌμž₯ν•œλ‹€.

Array.prototype.map

map λ©”μ„œλ“œλŠ” μžμ‹ μ„ ν˜ΈμΆœν•œ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 인수둜 전달받은 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•œλ‹€. 그리고 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’λ“€λ‘œ κ΅¬μ„±λœ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€. μ΄λ•Œ 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

const numbers = [1, 4, 9];

// map λ©”μ„œλ“œλŠ” numbers λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•œλ‹€.
// 그리고 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’λ“€λ‘œ κ΅¬μ„±λœ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
const roots = numbers.map(item => Math.sqrt(item));
// μœ„ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
// const roots = numbers.map(Mat.sqrt);

// map λ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
console.log(roots); // [ 1, 2, 3]
// map λ©”μ„œλ“œλŠ” 원본 배열을 λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(numbers); // [ 1, 4, 9]

πŸ’‘ forEach vs map

forEach λ©”μ„œλ“œμ™€ map λ©”μ„œλ“œμ˜ 곡톡점은 μžμ‹ μ„ ν˜ΈμΆœν•œ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 인수둜 전달받은 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•œλ‹€λŠ” 것이닀.

ν•˜μ§€λ§Œ forEach λ©”μ„œλ“œλŠ” μ–Έμ œλ‚˜ undefinedλ₯Ό λ°˜ν™˜ν•˜κ³  map λ©”μ„œλ“œλŠ” 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’λ“€λ‘œ κ΅¬μ„±λœ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•˜λŠ” 차이가 μžˆλ‹€.

λ‹€μ‹œλ§ν•΄, forEach λ©”μ„œλ“œλŠ” λ‹¨μˆœνžˆ λ°˜λ³΅λ¬Έμ„ λŒ€μ²΄ν•˜κΈ° μœ„ν•œ κ³ μ°¨ ν•¨μˆ˜μ΄κ³ , map λ©”μ„œλ“œλŠ” μš”μ†Œκ°’μ„ λ‹€λ₯Έ κ°’μœΌλ‘œ λ§€ν•‘ν•œ μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•˜κΈ° μœ„ν•œ κ³ μ°¨ ν•¨μˆ˜λ‹€.

map λ©”μ„œλ“œκ°€ μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” μƒˆλ‘œμš΄ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° 값은 map λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° κ°’κ³Ό λ°˜λ“œμ‹œ μΌμΉ˜ν•œλ‹€. 즉, map λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄κ³Ό map λ©”μ„œλ“œκ°€ μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œ 배열은 1:1 λ§€ν•‘ν•œλ‹€.

map λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” map λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄μ˜ μš”μ†Œκ°’κ³Ό 인덱슀, map λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄ 자체, 즉 thisλ₯Ό 순차적으둜 전달받을 수 μžˆλ‹€.

// map λ©”μ„œλ“œλŠ” μ½œλ°±ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ 3개(μš”μ†Œκ°’, 인덱슀, this)의 인수λ₯Ό μ „λ‹¬ν•œλ‹€.
[1, 2, 3].map((item, index, arr) => {
	 console.log(`μš”μ†Œκ°’: ${item}, 인덱슀: ${index}, this:${JSON.stringify(arr)}`);
	return item;
});

/*
μš”μ†Œκ°’: 1, 인덱슀: 0, this:[1,2,3]
μš”μ†Œκ°’: 2, 인덱슀: 1, this:[1,2,3]
μš”μ†Œκ°’: 3, 인덱슀: 2, this:[1,2,3]
*/

map λ©”μ„œλ“œ 두 번째 인수둜 map λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ this둜 μ‚¬μš©ν•  객체λ₯Ό 전달할 수 μžˆλ‹€.

class Prefixer {
  constructor(prefix) {
  this.prefix = prefix
}

  add(arr) {
   return arr.map(function (item) {
     // μ™ΈλΆ€μ—μ„œ thisλ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμœΌλ©΄ thisλŠ” undefinedλ₯Ό 가리킨닀.
      return  this.prefix + item;
    }, this); // map λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ this둜 μ‚¬μš©ν•  객체λ₯Ό 전달
  }
}

const prefixer = new Prefixer('-webkit-')
console.log(prefixer.add(['a', 'b']))
// [ '-webkit-a', '-webkit-b' ]

더 λ‚˜μ€ 방법은 ES6의 ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것.

class Prefixer {
  constructor(prefix) {
  this.prefix = prefix
}

  add(arr) {
	// ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ thisλ₯Ό μ°Έμ‘°ν•˜λ©΄ μƒμœ„ μŠ€μ½”ν”„μ˜ thisλ₯Ό κ·ΈλŒ€λ‘œ μ°Έμ‘°ν•œλ‹€
    return arr.map(item => this.prefix + item);
  }
}

const prefixer = new Prefixer('-webkit-')
console.log(prefixer.add(['a', 'b']))
// [ '-webkit-a', '-webkit-b' ]

Array.prototype.filter

filter λ©”μ„œλ“œλŠ” μžμ‹ μ„ ν˜Έγ…œγ„Ήν•œ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 인수둜 전달받은 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•œλ‹€. 그리고 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ true인 μš”μ†Œλ‘œλ§Œ κ΅¬μ„±λœ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€. μ΄λ•Œ 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

const numbers = [1, 2, 3, 4, 5];

// filter λ©”μ„œλ“œλŠ” numbers λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•œλ‹€.
// 그리고 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ true인 μš”μ†Œλ‘œλ§Œ κ΅¬μ„±λœ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
// λ‹€μŒμ˜ 경우 numbers λ°°μ—΄μ—μ„œ ν™€μˆ˜μΈ μš”μ†Œλ§Œ ν•„ν„°λ§ν•œλ‹€(1은 true둜 ν‰κ°€λœλ‹€.)
const odds = number.filter(item => item % 2);
console.log(odds); // [1, 3, 5]

filter λ©”μ„œλ“œκ°€ μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œ μƒˆλ‘œμš΄ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° 값은 filter λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° κ°’κ³Ό κ°™κ±°λ‚˜ μž‘λ‹€.

filter λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” filter λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄μ˜ μš”μ†Œκ°’κ³Ό 인덱슀, filter λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄ 자체, 즉 thisλ₯Ό 순차적으둜 전달받을 수 μžˆλ‹€.

// filter λ©”μ„œλ“œλŠ” 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ 3개(μš”μ†Œκ°’, 인덱슀, this)의 인수λ₯Ό μ „λ‹¬ν•œλ‹€.
[1, 2, 3].filter((item, index, arr) => {
 console.log(`μš”μ†Œκ°’: ${item}, 인덱슀: ${index}, this:${JSON.stringify(arr)}`);
	return item % 2;
});

/*
μš”μ†Œκ°’: 1, 인덱슀: 0, this:[1,2,3]
μš”μ†Œκ°’: 2, 인덱슀: 1, this:[1,2,3]
μš”μ†Œκ°’: 3, 인덱슀: 2, this:[1,2,3]
*/

filter λ©”μ„œλ“œ 두 번째 인수둜 filter λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ this둜 μ‚¬μš©ν•  객체λ₯Ό 전달할 수 μžˆλ‹€.

더 λ‚˜μ€ λ°©λ²•μœΌλ‘œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

class Users {
  constructor() {
    this.users = [
      { id: 1, name: 'Lee'},
      { id: 2, name 'Kim'}
    ];
  }

  // μš”μ†Œ μΆ”μΆœ
  findById(id) {
    // idκ°€ μΌμΉ˜ν•˜λŠ” μ‚¬μš©μžλ§Œ λ°˜ν™˜ν•œλ‹€.
    return this.users.filter(user => user.id === id)
  }

  // μš”μ†Œ 제거
  remove(id) {
    // idκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μžλ₯Ό μ œκ±°ν•œλ‹€.
    this.users = this.users.filter(user => user.id !== id)
  }
}

const users = new Users();

let user = users.findById(1)
console.log(user); // [{ id:1, name: 'Lee'}]

// idκ°€ 1인 μ‚¬μš©μžλ₯Ό μ œκ±°ν•œλ‹€.
users.remove(1);

user = user.findById(1);
console.log(user)

9-5. Array.prototype.reduce

reduce λ©”μ„œλ“œλŠ” μžμ‹ μ„ ν˜ΈμΆœν•œ 배열을 λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©° 인수둜 전달받은 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•œλ‹€. 그리고 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ„ λ‹€μŒ 순회 μ‹œμ— 콜백 ν•¨μˆ˜μ˜ 첫 번째 인수둜 μ „λ‹¬ν•˜λ©΄μ„œ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•˜λ‚˜μ˜ 결과값을 λ§Œλ“€μ–΄ λ°˜ν™˜ν•œλ‹€. μ΄λ•Œ 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

reduce λ©”μ„œλ“œλŠ” 첫 번째 인수둜 콜백 ν•¨μˆ˜, 두 번째 인수둜 μ΄ˆκΈ°κ°’μ„ μ „λ‹¬λ°›λŠ”λ‹€. reuce λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜μ—λŠ” 4개의 인수, μ΄ˆκΈ°κ°’ λ˜λŠ” 콜백 ν•¨μˆ˜μ˜ 이전 λ°˜ν™˜κ°’, reduce λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄μ˜ μš”μ†Œκ°’κ³Ό 인덱슀, reduce λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄ 자체, 즉 thisκ°€ μ „λ‹¬λœλ‹€.

// 1λΆ€ν„° 4κΉŒμ§€ λˆ„μ μ„ κ΅¬ν•œλ‹€.
const sum = [1, 2, 3, 4].reduce((accumulator, currentValue, index, array) => accumulator + currentValue, 0);

console.log(sum); // 10

reduce λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” 4개의 인수λ₯Ό 전달받아 λ°°μ—΄μ˜ length만큼 총 4회 ν˜ΈμΆœλœλ‹€.

reduce λ©”μ„œλ“œλŠ” μžμ‹ μ„ ν˜ΈμΆœν•œ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©° ν•˜λ‚˜μ˜ 결과값을 ꡬ해야 ν•˜λŠ” 경우 μ‚¬μš©ν•œλ‹€.

πŸ’‘ reduce λ©”μ„œλ“œμ˜ λ‹€μ–‘ν•œ ν™œμš© 방법

1. 평균 κ΅¬ν•˜κΈ°

const values = [1, 2, 3, 4, 5, 6];

const average = values.reduce((acc, cur, i, { length }) => {
	// λ§ˆμ§€λ§‰ μˆœνšŒκ°€ μ•„λ‹ˆλ©΄ λˆ„μ κ°’μ„ λ°˜ν™˜ν•˜κ³  λ§ˆμ§€λ§‰ 순회면 λˆ„μ κ°’μœΌλ‘œ 평균을 ꡬ해 λ°˜ν™˜ν•œλ‹€.
  	return i === length - 1 ? (acc + cur) / length : acc + cur;
}, 0);

console.log(average); // 3.5

2. μ΅œλŒ€κ°’ κ΅¬ν•˜κΈ°

const values = [1, 2, 3, 4, 5, 6];

const max = values.reduce((acc, cur => (acc > cur ? acc : cur), 0);
console.log(max);

μ΅œλŒ€κ°’μ„ κ΅¬ν• λ•ŒλŠ” reduce λ©”μ„œλ“œλ³΄λ‹€ Math.max λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법이 더 직관적이닀.

const values = [1, 2, 3, 4, 5, 6];

const max = Math.max(...values);
var max = Math.max.apply(null.values);
console.log(max); // 5

3. μš”μ†Œμ˜ 쀑볡 횟수 κ΅¬ν•˜κΈ°

const fruits = ['banana', 'apple', 'orange', 'orange', 'apple'];

const count = fruits.reduce((acc, cur) => {
  // 첫 번째 순회 μ‹œ accλŠ” μ΄ˆκΈ°κ°’μΈ {}이고 cur은 첫 번째 μš”μ†ŒμΈ 'banana'λ‹€.
  // μ΄ˆκΈ°κ°’μœΌλ‘œ 전달받은 빈 객체에 μš”μ†Œκ°’μΈ cur을 ν”„λ‘œνΌν‹° ν‚€λ‘œ, μš”μ†Œμ˜ 개수λ₯Ό ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ
  // ν• λ‹Ήν•œλ‹€. λ§Œμ•½ ν”„λ‘œνΌν‹° 값이 undefined(처음 λ“±μž₯ν•˜λŠ” μš”μ†Œ)이면 ν”„λ‘œνΌν‹° 값을 1둜 μ΄ˆκΈ°ν™”ν•œλ‹€.
  acc[cur] = (acc[cur] || 0) + 1;
  return acc;
}, {});

// 콜백 ν•¨μˆ˜λŠ” 총 5번 호좜되고 λ‹€μŒκ³Ό 같이 결과값을 λ°˜ν™˜ν•œλ‹€.
/*
{banana: 1} => {banana: 1, apple: 1} => {banana: 1, apple: 1, orange: 1}
=> {banana: 1, apple: 1, orange: 2} => {banana: 1, apple: 2, orange: 2}
*/

console.log(count); // { banana: 1, apple: 2, orange: 2 }

4. 쀑첩 λ°°μ—΄ 평탄화

const values = [1, [2, 3], 4, [5, 6]];

const flatten values.reduce((acc,cur) => acc.concat(cur), []);
// [1] => [1, 2, 3] => [1, 2, 3, 4] => [1, 2, 3, 4, 5, 6]

console.log(flatten); // [1, 2, 3, 4, 5, 6]

쀑첩 배열을 ν‰νƒ„ν™”ν• λ•ŒλŠ” Array.prototype.flat λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법이 더 직관적이닀.

[1, [2, 3, 4, 5]].flat(); // [1, 2, 3, 4, 5]

// 인수 2λŠ” 쀑첩 배열을 ν‰νƒ„ν™”ν•˜κΈ° μœ„ν•œ 깊이 값이닀.
[1, [2, 3, [4, 5]]].flat(2); // -> [1, 2, 3, 4, 5]

5. 쀑볡 μš”μ†Œ 제거

const values = [1, 2, 1, 3, 5, 4, 5, 3, 4, 4];

const result = values.reduce((unique, val, i, _values) =>
	// ν˜„μž¬ 순회 쀑인 μš”μ†Œμ˜ 인덱슀 iκ°€ val의 μΈλ±μŠ€μ™€ κ°™λ‹€λ©΄ val은 처음 μˆœνšŒν•˜λŠ” μš”μ†Œλ‹€.
	// ν˜„μž¬ 순회 쀑인 μš”μ†Œμ˜ 인덱슀 iκ°€ val의 μΈλ±μŠ€μ™€ λ‹€λ₯΄λ‹€λ©΄ val은 μ€‘λ³΅λœ μš”μ†Œλ‹€.
	// 처음 μˆœνšŒν•˜λŠ” μš”μ†Œλ§Œ μ΄ˆκΈ°κ°’ []κ°€ μ „λ‹¬λœ unique 배열에 λ‹΄μ•„ λ°˜ν™˜ν•˜λ©΄ μ€‘λ³΅λœ μš”μ†ŒλŠ” μ œκ±°λœλ‹€.
	_values.indexOf(val) === i ? [...unique, val ] : unique,
	[]
);

console.log(result); // [1, 2, 3, 5, 4]

쀑볡 μš”μ†Œλ₯Ό μ œκ±°ν•  λŒ€λŠ” reduce λ©”μ„œλ“œλ³΄λ‹€ filter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법이 더 직관적이닀.

const values = [1, 2, 1, 3, 5, 4, 5, 3, 4, 4];

// ν˜„μž¬ 순회 쀑인 μš”μ†Œμ˜ 인덱슀 iκ°€ val의 μΈλ±μŠ€μ™€ κ°™λ‹€λ©΄ val은 처음 μˆœνšŒν•˜λŠ” μš”μ†Œλ‹€. 이 μš”μ†Œλ§Œ ν•„ν„°λ§ν•œλ‹€.
const result = values.filter((val, i, _values) => _values.indexOf(value) === i );
console.log(result); // [1, 2, 3, 5, 4]

λ˜λŠ” μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ μΌν•œ κ°’λ“€μ˜ 집합인 Set을 μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. 쀑볡 μš”μ†Œλ₯Ό μ œκ±°ν•  λ•ŒλŠ” 이 방법을 μΆ”μ²œν•œλ‹€.

const values = [1, 2, 1, 3, 5, 4, 5, 3, 4, 4];

// 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” Set 객체의 νŠΉμ„±μ„ ν™œμš©ν•˜μ—¬ λ°°μ—΄μ—μ„œ μ€‘λ³΅λœ μš”μ†Œλ₯Ό μ œκ±°ν•  수 μžˆλ‹€.
const result = [...new Set(values)];
console.log(result); // [1, 2, 3, 5, 4]

reduce λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” μ–Έμ œλ‚˜ μ΄ˆκΈ°κ°’μ„ μ „λ‹¬ν•˜λŠ” 것이 μ•ˆμ „ν•˜λ‹€.

reduce λ©”μ„œλ“œλ‘œ 객체의 νŠΉμ • ν”„λ‘œνΌν‹° 값을 ν•©μ‚°ν•˜λŠ” 경우λ₯Ό μƒκ°ν•΄λ³΄μž

const products = [
  {id: 1, price: 100 },
  {id: 2, price: 200 },
  {id: 3, price: 300 }
];

/*
1번째 순회: acc => 0, cur => { id: 1, price: 100 }
2번째 순회: acc => 100, cur => { id: 2, price: 200 }
3번째 순회: acc => 300, cur => { id: 3, price: 300 }
*/
const priceSum = products.reduce((acc, cur) => acc.price + cur.price, 0);

console.log(pirceSum); // 600

μ΄ˆκΈ°κ°’μ„ μ „λ‹¬ν•˜μ§€ μ•ŠλŠ” 경우 합산을 ν•  수 μ—†μ§€λ§Œ μ΄ˆκΈ°κ°’μ„ μ „λ‹¬ν•œ 경우 합산을 ν•  수 μžˆλ‹€.

9-6. Array.prototype.some

some λ©”μ„œλ“œλŠ” 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 단 ν•œ λ²ˆμ΄λΌλ„ 참이면 true λͺ¨λ‘ 거짓이면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

some λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 배열이 빈 배열인 경우 μ–Έμ œλ‚˜ falseλ₯Ό λ°˜ν™˜ν•˜λ―€λ‘œ 주의

some λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” some λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ μš”μ†Œκ°’κ³Ό 인덱슀,thisλ₯Ό 순차적으둜 전달받을 수 μžˆλ‹€.

// λ°°μ—΄μ˜ μš”μ†Œ 쀑 10보닀 큰 μš”μ†Œκ°€ 1개 이상 μ‘΄μž¬ν•˜λŠ”μ§€ 확인
[5, 10, 15].some(item => itme > 10); // true

// λ°°μ—΄μ˜ μš”μ†Œ 쀑 0보닀 μž‘μ€ μš”μ†Œκ°€ 1개 이상 μ‘΄μž¬ν•˜λŠ”μ§€ 확인
[5, 10, 15].some(item => itme < 0); // false

// λ°°μ—΄μ˜ μš”μ†Œ 쀑 'banana'κ°€ 1개 이상 μ‘΄μž¬ν•˜λŠ”μ§€ 확인
['apple', 'banana', 'mango'].some(item => item === 'banana'); // true

// some λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 배열이 빈 배열인 경우 μ–Έμ œλ‚˜ flaseλ₯Ό λ°˜ν™˜ν•œλ‹€.
[].some(item => item > 3); // false

9-7. Array.prototype.every

every λ©”μ„œλ“œλŠ” 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ λͺ¨λ‘ 참이면 true 단 ν•œλ²ˆμ΄λΌλ„ 거짓이면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

every λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 배열이 빈 배열인 경우 μ–Έμ œλ‚˜ trueλ₯Ό λ°˜ν™˜ν•˜λ―€λ‘œ μ£Όμ˜ν•˜κΈ° λ°”λž€λ‹€.

every λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” every λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ μš”μ†Œκ°’κ³Ό 인덱슀,thisλ₯Ό 순차적으둜 전달받을 수 μžˆλ‹€.

// λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œκ°€ 3보닀 큰지 확인
[5, 10, 15].every(item => item > 3); // true

// λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œκ°€ 10보닀 큰지 확인
[5, 10, 15].every(item => item > 10); // false

// every λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 배열이 빈 배열인 경우 μ–Έμ œλ‚˜ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
[].evevry(item => item > 3); // true 

9-8. Array.prototype.find

ES6μ—μ„œ λ„μž…λœ find λ©”μ„œλ“œλŠ” μžμ‹ μ„ ν˜ΈμΆœν•œ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 인수둜 μ „λ‹¬λœ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ λ°˜ν™˜κ°’μ΄ true인 첫 번째 μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.

콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ true인 μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

const users = [
  { id: 1, name: 'Lee' },
  { id: 2, name: 'Kim' },
  { id: 2, name: 'Choi' },
  { id: 3, name: 'Park' }
  ];

// idκ°€ 2인 첫 번째 μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€. find λ©”μ„œλ“œλŠ” 배열이 μ•„λ‹ˆλΌ μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.
users.find(user => user.id === 2); // -> {id: 2, name: 'Kim'}
// Array#filterλŠ” 배열을 λ°˜ν™˜ν•œλ‹€.
[1, 2, 2, 3].filter(item => item === 2); // -> [2, 2]

// Array#findλŠ” μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.
[1, 2, 2, 3].find(item => item === 2); // -> 2

9-9. Array.prototype.findIndex

ES6μ—μ„œ λ„μž…λœ findIndex λ©”μ„œλ“œλŠ” μžμ‹ μ„ ν˜ΈμΆœν•œ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ 인수둜 μ „λ‹¬λœ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ λ°˜ν™˜κ°’μ΄ true인 첫 번째 μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€. 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ ture인 μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ -1을 λ°˜ν™˜ν•œλ‹€.

const users = [
  { id: 1, name: 'Lee' },
  { id: 2, name: 'Kim' },
  { id: 2, name: 'Choi' },
  { id: 3, name: 'Park' }
];

// idκ°€ 2인 μš”μ†Œμ˜ 인덱슀λ₯Ό κ΅¬ν•œλ‹€.
users.findIndex(user => user.id === 2); // -> 1

// name이 'Park'인 μš”μ†Œμ˜ 인덱슀λ₯Ό κ΅¬ν•œλ‹€.
users.findIndex(user => user.name === 'Park'); // -> 3

// μœ„μ™€ 같이 ν”„λ‘œνΌν‹° 킀와 ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ μš”μ†Œμ˜ 인덱슀λ₯Ό κ΅¬ν•˜λŠ” 경우
// λ‹€μŒκ³Ό 같이 콜백 ν•¨μˆ˜λ₯Ό 좔상화할 수 μžˆλ‹€.
function predicate(key, value) {
  // key와 valueλ₯Ό κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ €λ₯Ό λ°˜ν™˜
  return item => item[key] === value;
}

// idκ°€ 2인 μš”μ†Œμ˜ 인덱슀λ₯Ό κ΅¬ν•œλ‹€.
users.findIndex(predicate('id', 2)); // -> 1

// name이 'Park'인 μš”μ†Œμ˜ 인덱슀λ₯Ό κ΅¬ν•œλ‹€.
users.findIndex(predicate('name', 'Park')); // -> 3

9-10. Array.prototype.flatMap

ES10μ—μ„œ λ„μž…λœ flatMap λ©”μ„œλ“œλŠ” map λ©”μ„œλ“œλ₯Ό 톡해 μƒμ„±λœ μƒˆλ‘œμš΄ 배열을 ν‰νƒ„ν™”ν•œλ‹€. 즉, map λ©”μ„œλ“œμ™€ flat λ©”μ„œλ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜λŠ” νš¨κ³Όκ°€ μžˆλ‹€.

const arr = ['hello', 'world'];

// mapκ³Ό flat을 순차적으둜 μ‹€ν–‰
arr.map(x => x.spilt('')).flat();
// -> ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

// flatMap은 map을 톡해 μƒμ„±λœ μƒˆλ‘œμš΄ 배열을 ν‰νƒ„ν™”ν•œλ‹€.
arr.flatMap(x => x.split(''));
// -> ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
const arr = ['hello', 'world'];

// flatMap은 1λ‹¨κ³„λ§Œ ν‰νƒ„ν™”ν•œλ‹€.
arr.flatMap((str, index) => [index, [str, str.length]]);
// -> [[0, ['hello', 5]], [1, ['world', 5]]] => [0, ['hello', 5], 1, ['world', 5]]

// 평탄화 깊이λ₯Ό 지정해야 ν•˜λ©΄ flatMap λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ 말고 map λ©”μ„œλ“œμ™€ flat λ©”μ„œλ“œλ₯Ό 각각 ν˜ΈμΆœν•œλ‹€.
arr.map((str, index) => [index, [str, str.length]]).flat(2);
// -> [[0, ['hello', 5]], [1, ['world', 5]]] => [0, 'hello', 5, 1, 'world', 5]
post-custom-banner

0개의 λŒ“κΈ€