π λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ΅μ¬ 27μ₯. λ°°μ΄
01. λ°°μ΄μ΄λ?
μ¬λ¬ κ°μ κ°μ μμ°¨μ μΌλ‘ λμ΄ν μλ£κ΅¬μ‘°
μ¬μ© λΉλκ° λ§€μ° λμ κ°μ₯ κΈ°λ³Έμ μΈ μλ£κ΅¬μ‘°μ΄λ―λ‘ μ μμλκΈ°λ‘ νμ.
const arr = ['apple', 'banana', 'orange'];
πΉ μμ (Element) : λ°°μ΄μ΄ κ°μ§κ³ μλ κ°
πΉ μΈλ±μ€ (Index) : λ°°μ΄μμ λ°°μ΄μ μμμ μμΉ (0 μ΄μμ μ μ)
πΉ λκ΄νΈ νκΈ°λ²μ ν΅ν΄ μμμ μ κ·Όνλ€.
arr[0] // -> 'apple'
arr[1] // -> 'banana'
arr[2] // -> 'orange'
πΉ length νλ‘νΌν° : λ°°μ΄μ κΈΈμ΄(μμμ κ°μ)λ₯Ό λνλ΄λ νλ‘νΌν°
arr.length // -> 3
πΉλ°°μ΄μ κ°μ²΄ νμ μ΄λ€.
βλ°°μ΄μ μμ±νλ €λ©΄
πΉλ°°μ΄ 리ν°λ΄, Array μμ±μ ν¨μ, Array.of, Array.from λ©μλλ‘ μμ±
const arr = [1, 2, 3];
arr.constructor === Array // -> true
Object.getPrototypeOf(arr) === Array.prototype // -> true
πΉμΌλ° κ°μ²΄μμ μ°¨μ΄μ
β‘οΈ μΌλ° κ°μ²΄μ λ¬λ¦¬, λ°°μ΄μ κ°μ μμ, length νλ‘νΌν°κ° μ‘΄μ¬
02. μλ°μ€ν¬λ¦½νΈ λ°°μ΄μ λ°°μ΄μ΄ μλλ€
ν¬μ λ°°μ΄(spares array) : λ©λͺ¨λ¦¬ κ³΅κ° λμΌνμ§ μμλ λ¨ / λ°°μ΄μ μμκ° μ°μμ μΌλ‘ μ΄μ΄μ Έ μμ§ μλ λ°°μ΄
π μΌλ°μ μΈ μλ―Έμ λ°°μ΄μΈ λ°μ§ λ°°μ΄(dense array)μ λμΌν ν¬κΈ°μ λ©λͺ¨λ¦¬ 곡κ°μ΄ μ°μμ μΌλ‘ λμ΄λ¨ / νλμ λ°μ΄ν° νμ μΌλ‘ ν΅μΌ
β‘οΈ μλ°μ€ν¬λ¦½νΈμ λ°°μ΄μ μΌλ°μ μΈ λ°°μ΄μ λμμ νλ΄ λΈ νΉμμ κ°μ²΄μ΄λ―λ‘, 'μλ°μ€ν¬λ¦½νΈ λ°°μ΄μ λ°°μ΄μ΄ μλλ€' λΌκ³ νννκ³ μλ€.
03. length νλ‘νΌν°μ ν¬μ λ°°μ΄
π‘ length νλ‘νΌν°
λ°°μ΄μ κΈΈμ΄λ₯Ό λνλ΄λ 0 μ΄μμ μ μκ°
πΉλ°°μ΄μ μμλ₯Ό μΆκ°/μμ νλ©΄ μλ κ°±μ λλ€.
πΉlength νλ‘νΌν° κ°λ³΄λ€ μμ μ«μ κ° ν λΉ : λ°°μ΄μ κΈΈμ΄κ° μ€μ΄λ¦
πΉlength νλ‘νΌν° κ°λ³΄λ€ ν° μ«μ κ° ν λΉ : κ°μ λ³κ²½ O / μ€μ λ‘ λ°°μ΄μ κΈΈμ΄ λμ΄λμ§ X
β‘οΈ μ΄λ° κ²½μ°, λ°°μ΄μ μμ μ€ μΌλΆκ° λΉμ΄μκ² λ¨ -> μ΄κ²μ ν¬μ λ°°μ΄μ΄λΌκ³ νλ€.
β‘οΈ ν¬μ λ°°μ΄ : length > λ°°μ΄μ μ€μ μμ κ°μ
β οΈ ν¬μ λ°°μ΄μ μμ±νμ§ μλλ‘ μ£Όμνμ.
04. λ°°μ΄ μμ±
1) λ°°μ΄ λ¦¬ν°λ΄
πΉκ°μ₯ μΌλ°μ μ΄κ³ κ°νΈν λ°°μ΄ μμ± λ°©μ
πΉμμλ₯Ό μΌνλ‘ κ΅¬λΆνκ³ , λκ΄νΈλ‘([]) λ¬Άμ΄μ νννλ€.
const arr = [1, 2, 3];
console.log(arr.length); // 3
2) Array μμ±μ ν¨μ
π‘ μ λ¬λ μΈμμ κ°μμ λ°λΌ λ€λ₯΄κ² λμν¨
πΉμ λ¬λ μΈμκ° 1κ°μ΄κ³ μ«μμΈ κ²½μ°) length νλ‘νΌν° κ°μ΄ μΈμμΈ λ°°μ΄ μμ±
const arr = new Array(10);
console.log(arr); // [empty × 10]
console.log(arr.length); // 10
πΉμ λ¬λ μΈμκ° μλ κ²½μ°) λΉ λ°°μ΄ μμ±
new Array(); // -> []
πΉμ λ¬λ μΈμκ° 2κ° μ΄μμ΄κ±°λ μ«μκ° μλ κ²½μ°) μΈμλ₯Ό μμλ‘ κ°λ λ°°μ΄ μμ±
// μ λ¬λ μΈμκ° 2κ° μ΄μμ΄λ©΄ μΈμλ₯Ό μμλ‘ κ°λ λ°°μ΄μ μμ±νλ€.
new Array(1, 2, 3); // -> [1, 2, 3]
// μ λ¬λ μΈμκ° 1κ°μ§λ§ μ«μκ° μλλ©΄ μΈμλ₯Ό μμλ‘ κ°λ λ°°μ΄μ μμ±νλ€.
new Array({}); // -> [{}]
3) Array.of
π‘ μ λ¬λ μΈμλ₯Ό μμλ‘ κ°λ λ°°μ΄μ μμ±νλ€.
Array.of(1); // -> [1]
Array.of(1, 2, 3); // -> [1, 2, 3]
Array.of('string'); // -> ['string']
4) 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]
05. λ°°μ΄ μμμ μ°Έμ‘°
π‘ λκ΄νΈ([ ]) μ μΈλ±μ€λ₯Ό λ£μ΄ λ°°μ΄μ μμλ₯Ό μ°Έμ‘°νλ€.
const arr = [1, 2];
// μΈλ±μ€κ° 0μΈ μμλ₯Ό μ°Έμ‘°
console.log(arr[0]); // 1
// μΈλ±μ€κ° 1μΈ μμλ₯Ό μ°Έμ‘°
console.log(arr[1]); // 2
πΉ μ‘΄μ¬νμ§ μλ μμμ μ κ·Όνλ©΄ undefinedκ° λ°νλλ€.
06. λ°°μ΄ μμμ μΆκ°μ κ°±μ
πΉμ‘΄μ¬νμ§ μλ μΈλ±μ€λ₯Ό ν΅ν΄ κ°μ ν λΉνλ©΄ μλ‘μ΄ μμκ° μΆκ°λκ³ ,
πΉλμμ length νλ‘νΌν°μ κ°μ΄ μλ κ°±μ λλ€.
const arr = [0];
// λ°°μ΄ μμμ μΆκ°
arr[1] = 1;
console.log(arr); // [0, 1]
console.log(arr.length); // 2
07. λ°°μ΄ μμμ μμ
πΉ λ°°μ΄μ κ°μ²΄μ΄κΈ° λλ¬Έμ delete μ°μ°μλ‘ νΉμ μμλ₯Ό μμ ν μ μλ€.
β‘οΈ νμ§λ§ length νλ‘νΌν°μ μν₯μ΄ μκ³ , ν¬μ λ°°μ΄μ΄ λκΈ° λλ¬Έμ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
const arr = [1, 2, 3];
// λ°°μ΄ μμμ μμ
delete arr[1];
console.log(arr); // [1, empty, 3]
// length νλ‘νΌν°μ μν₯μ μ£Όμ§ μλλ€. μ¦, ν¬μ λ°°μ΄μ΄ λλ€.
console.log(arr.length); // 3
π‘ λμ , Array.prototype.splice λ©μλλ₯Ό μ¬μ©ν΄ ν¬μ λ°°μ΄μ λ§λ€μ§ μμΌλ©΄μ λ°°μ΄μ νΉμ μμλ₯Ό μμ ν μμ νλ κ²μ΄ μ’λ€.
const arr = [1, 2, 3];
// Array.prototype.splice(μμ λ₯Ό μμν μΈλ±μ€, μμ ν μμ μ)
// arr[1]λΆν° 1κ°μ μμλ₯Ό μ κ±°
arr.splice(1, 1);
console.log(arr); // [1, 3]
// length νλ‘νΌν°κ° μλ κ°±μ λλ€.
console.log(arr.length); // 2
08. λ°°μ΄ λ©μλ
μλ³Έ λ°°μ΄μ μ§μ λ³κ²½νλ λ©μλ (mutator method) 보λ€,
μλ³Έ λ°°μ΄μ μ§μ λ³κ²½νμ§ μκ³ μλ‘μ΄ λ°°μ΄μ μμ±νμ¬ λ°ννλ λ©μλ (accessor method) λ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
1) Array.isArray
π‘ μ λ¬λ μΈμκ° λ°°μ΄μΈμ§ μ¬λΆλ₯Ό booleanμΌλ‘ λ°ννλ λ©μλ
2) Array.prototype.indexOf
π‘μλ³Έ λ°°μ΄μμ μΈμλ‘ μ λ¬λ μμμ μΈλ±μ€λ₯Ό λ°ννλ λ©μλ
πΉ μλ³Έ λ°°μ΄μ μΈμλ‘ μ λ¬ν μμκ° μ‘΄μ¬νμ§ μμΌλ©΄ -1μ λ°ννλ€λ μ μ μ΄μ©νμ¬
β‘οΈ λ°°μ΄μ νΉμ μμκ° μ‘΄μ¬νλμ§ νμΈν μ μλ€.
const foods = ['apple', 'banana', 'orange'];
// foods λ°°μ΄μ 'orange' μμκ° μ‘΄μ¬νλμ§ νμΈνλ€.
if (foods.indexOf('orange') === -1 {
// foods λ°°μ΄μ 'orange' μμκ° μ‘΄μ¬νμ§ μμΌλ©΄ 'orange' μμλ₯Ό μΆκ°νλ€.
foods.push('orange');
}
console.log(foods); // ["apple", "banana", "orange"]
3) Array.prototype.push
π‘μΈμλ₯Ό λ°°μ΄μ λ§μ§λ§ μμλ‘ μΆκ°νκ³ , λ³κ²½λ length νλ‘νΌν° κ°μ λ°ννλ λ©μλ
π‘ push λ©μλ 보λ€λ length νλ‘νΌν°λ‘ λ§μ§λ§μ μ§μ μΆκ°νλ κ²μ΄ λ μ±λ₯μ μΌλ‘ μ’λ€.
const arr = [1, 2];
// arr.push(3)κ³Ό λμΌν μ²λ¦¬λ₯Ό νλ€. μ΄ λ°©λ²μ΄ push λ©μλλ³΄λ€ λΉ λ₯΄λ€.
// arr λ°°μ΄μ μΆκ°νλ €λ μΈλ±μ€ κ°μ΄ length, μ¦ 2μ΄λ―λ‘ -> length νλ‘νΌν°λ₯Ό μ΄μ©νμ¬ λ°°λ ΉγΉμ λ§μ§λ§μ μμ μΆκ° κ°λ₯
arr[arr.length] = 3;
console.log(arr); // [1, 2, 3]
4) Array.prototype.pop
π‘ μλ³Έ λ°°μ΄μμ λ§μ§λ§ μμλ₯Ό μ κ±°νκ³ μ κ±°ν μμλ₯Ό λ°ννλ λ©μλ
π‘ λΉ λ°°μ΄μ΄λ©΄ undefinedλ₯Ό λ°ννλ©°, μλ³Έ λ°°μ΄μ μ§μ λ³κ²½νλ€.
π‘ pop λ©μλμ push λ©μλλ₯Ό ν΅ν΄ μ€νμ ꡬνν μ μλ€.
β‘οΈ μ€νμ νμ μ μΆ λ°©μμ μλ£κ΅¬μ‘°μ΄λ―λ‘, μ€νμ λ°μ΄ν°λ₯Ό λ°μ΄ λ£λ pushμ μ€νμμ λ°μ΄ν°λ₯Ό κΊΌλ΄λ pop νμ©.
5) Array.prototype.unshift
π‘ μΈμλ₯Ό μλ³Έ λ°°μ΄μ μ λμ μΆκ°νκ³ , λ³κ²½λ length νλ‘νΌν° κ°μ λ°ννλ λ©μλ
6) Array.prototype.shift
π‘ μλ³Έ λ°°μ΄μμ 첫 λ²μ§Έ μμλ₯Ό μ κ±°νκ³ μ κ±°λ μμλ₯Ό λ°ννλ λ©μλ
π‘ shift λ©μλμ push λ©μλλ₯Ό ν΅ν΄ νλ₯Ό ꡬνν μ μλ€.
β‘οΈ νλ μ μ μ μΆ λ°©μμ μλ£κ΅¬μ‘°μ΄λ―λ‘, νμ λ°μ΄ν°λ₯Ό λ°μ΄ λ£λ pushμ νμ κ°μ₯ λ¨Όμ λ°μ΄ λ£μ λ°μ΄ν°λ₯Ό κΊΌλ΄λ shift νμ©.
7) Array.prototype.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 λ©μλλ₯Ό μ¬μ©νλ λμ ES6μ μ€νλ λ λ¬Έλ²μ μΌκ΄μ± μκ² μ¬μ©νλ κ² κΆμ₯.
-> "μ€νλ λ λ¬Έλ²"μμ μ΄ν΄λ³΄λλ‘ νμ.
8) Array.prototype.splice
π‘μλ³Έ λ°°μ΄μ μ€κ°μ μλ μμλ₯Ό μΆκ° λλ μ κ±°ν κ²½μ° μ¬μ©.
πΉ 3κ°μ λ§€κ°λ³μ ('μλ³Έ λ°°μ΄μ μμλ₯Ό μ κ±°νκΈ° μμν μΈλ±μ€', 'μ κ±°νκΈ° μμν μΈλ±μ€λΆν° μ κ±°ν μμμ κ°μ', 'μ κ±°ν μμΉμ μ½μ ν μμλ€μ λͺ©λ‘')
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]
πΉ νΉμ μμλ₯Ό μ κ±°νλ €λ©΄ -> indexOf λ©μλλ₯Ό ν΅ν΄ νΉμ μμμ μΈλ±μ€λ₯Ό μ·¨λνμ¬ κ°λ₯
πΉ μ€λ³΅λ νΉμ μμλ₯Ό μ λΆ μ κ±°νλ €λ©΄ -> filter λ©μλλ₯Ό ν΅ν΄ κ°λ₯
9) Array.prototype.slice
π‘ μΈμλ‘ μ λ¬λ λ²μμ μμλ€μ 볡μ¬νμ¬ λ°°μ΄λ‘ λ°ννλ λ©μλ
β οΈ splice λ©μλμ λ¬λ¦¬ μλ³Έ λ°°μ΄μ λ³κ²½λμ§ μλλ€.
πΉ 2κ°μ λ§€κ°λ³μ ('볡μ¬λ₯Ό μμν μΈλ±μ€', '볡μ¬λ₯Ό μ’ λ£ν μΈλ±μ€(μ΄ μΈλ±μ€μ ν΄λΉνλ μμλ 볡μ¬X)')
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]
πΉ μμ 볡μ¬λ₯Ό μννλ€.
10) Array.prototype.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'
11) Array.prototype.reverse
π‘ μλ³Έ λ°°μ΄μ μμλ₯Ό λ°λλ‘ λ€μ§κ³ , λ³κ²½λ λ°°μ΄μ λ°ννλ λ©μλ
πΉ μλ³Έ λ°°μ΄ λ³κ²½ O
const arr = [1, 2, 3];
const result = arr.reverse();
// reverse λ©μλλ μλ³Έ λ°°μ΄μ μ§μ λ³κ²½νλ€.
console.log(arr); // [3, 2, 1]
// λ°νκ°μ λ³κ²½λ λ°°μ΄μ΄λ€.
console.log(result); // [3, 2, 1]
12) Array.prototype.fill
π‘ μΈμλ‘ μ λ¬λ°μ κ°μΌλ‘ λ°°μ΄μ μ²μλΆν° λκΉμ§ λ³κ²½νλ λ©μλ
πΉ μλ³Έ λ°°μ΄ λ³κ²½ O
const arr = [1, 2, 3];
// μΈμλ‘ μ λ¬ λ°μ κ° 0μ λ°°μ΄μ μ²μλΆν° λκΉμ§ μμλ‘ μ±μ΄λ€.
arr.fill(0);
// fill λ©μλλ μλ³Έ λ°°μ΄μ μ§μ λ³κ²½νλ€.
console.log(arr); // [0, 0, 0]
πΉ λ λ²μ§Έ μΈμ -> μμ μ±μ°κΈ° μμν μΈλ±μ€ μ λ¬
πΉ μΈ λ²μ§Έ μΈμ -> μμ μ±μ°κΈ° λ©μΆ μΈλ±μ€ μ λ¬
13) Array.prototype.includes
π‘ λ°°μ΄ λ΄μ νΉμ μμκ° ν¬ν¨λμ΄ μλμ§ μ¬λΆμ λ°λΌ true λλ false λ°ννλ λ©μλ
πΉ 첫 λ²μ§Έ μΈμ -> κ²μν λμ μ§μ
πΉ λ λ²μ§Έ μΈμ -> κ²μμ μμν μΈγ·κ²μ€ μ λ¬(μλ΅ν κ²½μ° κΈ°λ³Έκ°μ 0)
14) Array.prototype.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]]]
πΉ μ€μ²© λ°°μ΄μ νννν κΉμ΄λ₯Ό μΈμλ‘ μ λ¬ (μλ΅ν κ²½μ° κΈ°λ³Έκ° 1 / Infinity μ λ¬νλ©΄ λͺ¨λλ₯Ό ννν)
09. λ°°μ΄ κ³ μ°¨ ν¨μ
κ³ μ°¨ ν¨μ(Higher-Order Function, HOF)λ, ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°κ±°λ ν¨μλ₯Ό λ°ννλ ν¨μ
μΈλΆ μνμ λ³κ²½μ΄λ κ°λ³ λ°μ΄ν°λ₯Ό νΌνκ³ , λΆλ³μ±μ μ§ν₯νλ ν¨μν νλ‘κ·Έλλ°μ κΈ°λ°μ λκ³ μλ€.
1) Array.prototype.sort
π‘ λ°°μ΄μ μμλ₯Ό μ λ ¬νκ³ , μ λ ¬λ λ°°μ΄μ λ°ννλ λ©μλ
πΉ μλ³Έ λ°°μ΄μ μ§μ λ³κ²½ O
πΉ κΈ°λ³Έ : μ€λ¦μ°¨μμΌλ‘ μμ μ λ ¬
πΉ λ΄λ¦Όμ°¨μ μ λ ¬ : sort λ©μλ μ¬μ© ν, reverse λ©μλ μ¬μ©νλ©΄ κ°λ₯
β οΈ sortμ κΈ°λ³Έ μ λ ¬ μμλ μ λμ½λ μ½λ ν¬μΈνΈμ μμλ₯Ό λ°λ₯Έλ€.
β‘οΈ μ«μ μμλ‘ μ΄λ£¨μ΄μ§ λ°°μ΄μ μ λ ¬ν λ -> λ°°μ΄μ μμλ₯Ό λ¬Έμμ΄λ‘ λ³ννκ³ , μ λμ½λ μ½λ ν¬μΈνΈμ μμλ₯Ό κΈ°μ€μΌλ‘ μ λ ¬νμ¬ -> μλμΉ μμ κ²°κ³Όκ° λμ¬ μ μλ€.
β‘οΈ μ«μ μμλ₯Ό μ λ ¬ν λ) μ λ ¬ μμλ₯Ό μ μνλ λΉκ΅ ν¨μλ₯Ό μΈμλ‘ μ λ¬ν΄μΌ νλ€.
<λΉκ΅ ν¨μμ λ°νκ°>
πΉ μμ -> λ λ²μ§Έ μΈμλ₯Ό μ°μ μ
πΉ μμ -> 첫 λ²μ§Έ μΈμλ₯Ό μ°μ μ
πΉ 0 -> μ λ ¬νμ§ μλλ€.
2) Array.prototype.forEach
π‘ for λ¬Έμ λ체ν μ μλ κ³ μ°¨ ν¨μ
πΉ λ΄λΆμμ λ°λ³΅λ¬Έμ ν΅ν΄ μμ μ νΈμΆν λ°°μ΄μ μννλ€.
πΉ μνν΄μΌ ν μ²λ¦¬λ₯Ό μ½λ°± ν¨μλ‘ μ λ¬λ°μ λ°λ³΅μ μΌλ‘ νΈμΆνλ€.
(ex. λ°°μ΄μ μμκ° 3κ°μ΄λ©΄, μ½λ°± ν¨μλ 3λ² νΈμΆλ¨)
const numbers = [1, 2, 3];
let pows = [];
// forEach λ©μλλ numbers λ°°μ΄μ λͺ¨λ μμλ₯Ό μννλ©΄μ μ½λ°± ν¨μλ₯Ό λ°λ³΅ νΈμΆνλ€.
numbers.forEach(item => pows.push(item ** 2));
console.log(pows); // [1, 4, 9]
πΉ forEach λ©μλμ μ½λ°± ν¨μλ forEach λ©μλλ₯Ό νΈμΆν λ°°μ΄μ μμκ°, μΈλ±μ€, forEach λ©μλλ₯Ό νΈμΆν λ°°μ΄(this)λ₯Ό μμ°¨μ μΌλ‘ μ λ¬λ°λλ€.
πΉ forEach λ©μλμ λ°νκ°μ νμ undefinedλ€.
πΉ forEach λ©μλ λ΄λΆμμλ for λ¬Έμ ν΅ν΄(λ΄λΆλ‘ μλν΄μ) λ°°μ΄μ μννλλ°, for λ¬Έκ³Όλ λ¬λ¦¬ break, continue λ¬Έμ μ¬μ©ν μ μμ΄μ λ°°μ΄μ λͺ¨λ μμλ₯Ό λͺ¨λ μννκ³ μ€κ°μ μ€λ¨ν μ μλ€.
πΉ ν¬μ λ°°μ΄μ κ²½μ°, μ‘΄μ¬νμ§ μλ μμλ μν λμμμ μ μΈλλ€.
π‘ for λ¬Έμ λΉν΄ κ°λ μ±μ΄ μ’μ, λμ μ±λ₯μ΄ νμν κ²½μ°κ° μλλΌλ©΄ forEach λ©μλ μ¬μ© κΆμ₯
3) Array.prototype.map
π‘ μμ μ νΈμΆν λ°°μ΄μ μννλ©΄μ μ½λ°± ν¨μμ λ°νκ°λ€λ‘ ꡬμ±λ μλ‘μ΄ λ°°μ΄μ λ°ννλ€.
πΉ μλ³Έ λ°°μ΄ λ³κ²½ X
const numbers = [1, 4, 9];
// map λ©μλλ numbers λ°°μ΄μ λͺ¨λ μμλ₯Ό μννλ©΄μ μ½λ°± ν¨μλ₯Ό λ°λ³΅ νΈμΆνλ€.
// κ·Έλ¦¬κ³ μ½λ°± ν¨μμ λ°νκ°λ€λ‘ ꡬμ±λ μλ‘μ΄ λ°°μ΄μ λ°ννλ€.
const roots = numbers.map(item => Math.sqrt(item));
// μ μ½λλ λ€μκ³Ό κ°λ€.
// const roots = numbers.map(Math.sqrt);
// map λ©μλλ μλ‘μ΄ λ°°μ΄μ λ°ννλ€
console.log(roots); // [ 1, 2, 3 ]
// map λ©μλλ μλ³Έ λ°°μ΄μ λ³κ²½νμ§ μλλ€
console.log(numbers); // [ 1, 4, 9 ]
π‘ map λ©μλκ° λ°νν μλ‘μ΄ λ°°μ΄μ map λ©μλλ₯Ό νΈμΆν κΈ°μ‘΄μ λ°°μ΄κ³Ό λ°λμ 1λ1 λ§€νλλ€.
// 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 λ©μλλ₯Ό νΈμΆν λ°°μ΄μ μμκ°, μΈλ±μ€, map λ©μλλ₯Ό νΈμΆν λ°°μ΄(this)λ₯Ό μμ°¨μ μΌλ‘ μ λ¬λ°λλ€.
4) Array.prototype.filter
π‘ μμ μ νΈμΆν λ°°μ΄μ μννλ©΄μ μ½λ°± ν¨μμ λ°νκ°μ΄ trueμΈ μμλ‘λ§ κ΅¬μ±λ μλ‘μ΄ λ°°μ΄μ λ°ννλ€.
const numbers = [1, 2, 3, 4, 5];
// filter λ©μλλ numbers λ°°μ΄μ λͺ¨λ μμλ₯Ό μννλ©΄μ μ½λ°± ν¨μλ₯Ό λ°λ³΅ νΈμΆνλ€.
// κ·Έλ¦¬κ³ μ½λ°± ν¨μμ λ°νκ°μ΄ trueμΈ μμλ‘λ§ κ΅¬μ±λ μλ‘μ΄ λ°°μ΄μ λ°ννλ€.
// λ€μμ κ²½μ° numbers λ°°μ΄μμ νμμΈ μμλ§μ νν°λ§νλ€(1μ trueλ‘ νκ°λλ€).
const odds = numbers.filter(item => item % 2);
console.log(odds); // [1, 3, 5]
πΉ map λ©μλμ λ¬λ¦¬ filter λ©μλκ° λ°νν μλ‘μ΄ λ°°μ΄μ κΈ°μ‘΄μ λ°°μ΄κ³Ό κΈΈμ΄κ° λ€λ₯Ό μ μλ€.
πΉ filter λ©μλλ₯Ό νΈμΆν λ°°μ΄μ μμκ°, μΈλ±μ€, filter λ©μλλ₯Ό νΈμΆν λ°°μ΄(this)μ μμ°¨μ μΌλ‘ μ λ¬λ°λλ€.
πΉ μμ μ νΈμΆν λ°°μ΄μμ νΉμ μμλ₯Ό μ κ±°νκΈ° μν΄ μ¬μ©ν μλ μλ€.
5) Array.prototype.reduce
π‘ μμ μ νΈμΆν λ°°μ΄μ μννλ©΄μ μ½λ°± ν¨μλ₯Ό νΈμΆνλ€.
πΉ μ½λ°± ν¨μμ λ°νκ°μ λ€μ μνμμμ μ½λ°± ν¨μμ 첫 λ²μ§Έ μΈμλ‘ μ λ¬λλ€.
πΉ μ΄λ°μμΌλ‘ μννλ©΄μ μ΅μ’ μ μΌλ‘λ νλμ κ²°κ³Όκ°μ λ°ννλ€.
πΉ μλ³Έ λ°°μ΄μ λ³κ²½ X
// [1, 2, 3, 4]μ λͺ¨λ μμμ λμ μ ꡬνλ€.
const sum = [1, 2, 3, 4].reduce((accumulator, currentValue, index, array) => accumulator + currentValue, 0);
console.log(sum); // 10
<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. μ΅λκ° κ΅¬νκΈ° (reduce λ©μλλ³΄λ€ Math.max λ©μλλ₯Ό μ¬μ©νλ λ°©λ²μ΄ λ μ§κ΄μ )
const values = [1, 2, 3, 4, 5];
const max = values.reduce((acc, cur) => (acc > cur ? acc : cur), 0);
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. μ€μ²© λ°°μ΄ ννν (redude λ©μλλ³΄λ€ Array.prototype.flat λ©μλ μ¬μ©μ΄ λ μ§κ΄μ )
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]
[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. μ€λ³΅ μμ μ κ±° (reduce λ©μλλ³΄λ€ filter λ©μλ μ¬μ©μ΄ λ μ§κ΄μ )
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]
6) Array.prototype.some
π‘ μμ μ νΈμΆν λ°°μ΄μ μννλ©΄μ μ½λ°± ν¨μλ₯Ό νΈμΆνλ€.
πΉ μ½λ°± ν¨μ λ°νκ°μ΄ λ¨ ν λ²μ΄λΌλ μ°Έμ΄λ©΄ true, κ±°μ§μ΄λ©΄ falseλ₯Ό λ°ννλ€.
πΉ some λ©μλλ₯Ό νΈμΆν λ°°μ΄μ΄ λΉ λ°°μ΄μΈ κ²½μ°, false λ°ν
// λ°°μ΄μ μμ μ€μ 10λ³΄λ€ ν° μμκ° 1κ° μ΄μ μ‘΄μ¬νλμ§ νμΈ
[5, 10, 15].some(item => item > 10); // -> true
// λ°°μ΄μ μμ μ€μ 0λ³΄λ€ μμ μμκ° 1κ° μ΄μ μ‘΄μ¬νλμ§ νμΈ
[5, 10, 15].some(item => item < 0); // -> false
// λ°°μ΄μ μμ μ€μ 'banana'κ° 1κ° μ΄μ μ‘΄μ¬νλμ§ νμΈ
['apple', 'banana', 'mango'].some(item => item === 'banana'); // -> true
// some λ©μλλ₯Ό νΈμΆν λ°°μ΄μ΄ λΉ λ°°μ΄μΈ κ²½μ° μΈμ λ falseλ₯Ό λ°ννλ€.
[].some(item => item > 3); // -> false
7) Array.prototype.every
π‘ μμ μ νΈμΆν λ°°μ΄μ μννλ©΄μ μ½λ°± ν¨μλ₯Ό νΈμΆνλ€.
πΉ μ½λ°± ν¨μ λ°νκ°μ΄ λͺ¨λ μ°Έμ΄λ©΄ true, κ±°μ§μ΄λ©΄ falseλ₯Ό λ°ννλ€.
πΉ every λ©μλλ₯Ό νΈμΆν λ°°μ΄μ΄ λΉ λ°°μ΄μΈ κ²½μ°, true λ°ν
// λ°°μ΄μ λͺ¨λ μμκ° 3λ³΄λ€ ν°μ§ νμΈ
[5, 10, 15].every(item => item > 3); // -> true
// λ°°μ΄μ λͺ¨λ μμκ° 10λ³΄λ€ ν°μ§ νμΈ
[5, 10, 15].every(item => item > 10); // -> false
// every λ©μλλ₯Ό νΈμΆν λ°°μ΄μ΄ λΉ λ°°μ΄μΈ κ²½μ° μΈμ λ trueλ₯Ό λ°ννλ€.
[].every(item => item > 3); // -> true
8) Array.prototype.find
π‘ μμ μ νΈμΆν λ°°μ΄μ μννλ©΄μ μ½λ°± ν¨μλ₯Ό νΈμΆνλ©΄μ λ°νκ°μ΄ trueμΈ μ²« λ²μ§Έ μμλ₯Ό λ°ννλ€.
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) Array.prototype.findIndex
π‘ μμ μ νΈμΆν λ°°μ΄μ μννλ©΄μ μ½λ°± ν¨μλ₯Ό νΈμΆνλ©΄μ λ°νκ°μ΄ trueμΈ μ²« λ²μ§Έ μμμ μΈλ±μ€λ₯Ό λ°ννλ€.
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
10) Array.prototype.flatMap
π‘ map λ©μλλ₯Ό ν΅ν΄ μμ±λ μλ‘μ΄ λ°°μ΄μ ννννλ€.
πΉ μ¦, map λ©μλμ flat λ©μλλ₯Ό μμ°¨μ μΌλ‘ μ€ννλ€.
const arr = ['hello', 'world'];
// mapκ³Ό flatμ μμ°¨μ μΌλ‘ μ€ν
arr.map(x => x.split('')).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]
π μ°Έκ³ μλ£