[JS] 배열 메소드(Array methods)

javaScript 기초를 탄탄하게 다져보자

Posted by lim.Chuck on December 20, 2024

[JavaScript]

기초

  1. [JS] Js기초
  2. [JS] Js기초 변수
  3. [JS] Js기초 자료형
  4. [JS] Js기초 형변환
  5. [JS] Js기초 연산자
  6. [JS] Js기초 반복문
  7. [JS] Js기초 switch
  8. [JS] Js기초 function
  9. [JS] Js기초 객체
  10. [JS] Js기초 배열

중급

  1. [JS] Js중급 호이스팅(Hoisting)과 TDZ(Temporal Dead Zone)
  2. [JS] Js중급 생성자함수
  3. [JS] 객체 메소드(Object methods), 계산된 프로퍼티(Computed property)
  4. [JS] 심볼(Symbol)
  5. [JS] WeakMap WeakSet
  6. [JS] 숫자, 수학 method (Number, Math)
  7. [JS] 문자열 메소드(String methods)
  8. [JS] 배열 메소드(Array methods)
  9. [JS] 구조 분해 할당 (Destructuring assignment)
  10. [JS] 매개변수 리스트와 전개 문법(Rest parameters and spread syntax)
  11. [JS] 클로저(Closure)
  12. [JS] setTimeout / setInterval
  13. [JS] call / apply / bind
  14. [JS] 상속, 프로토타입(Prototype)
  15. [JS] 클래스(Class)
  16. [JS] 클로미스(Promise)
  17. [JS] 비동기 처리(Async/Await)
  18. [JS] Generator
  19. [JS] 메모리 릭(Memory Leak)

배열 메소드! 데이터를 다루는 가장 강력한 도구들이야! 🛠️

1. 기본적인 배열 메소드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const arr = [1, 2, 3, 4, 5];

// 배열 끝 조작
arr.push(6); // 끝에 추가
arr.pop(); // 끝에서 제거

// 배열 앞 조작
arr.unshift(0); // 앞에 추가
arr.shift(); // 앞에서 제거

// 배열 일부 가져오기
arr.slice(1, 3); // [2, 3] (인덱스 1부터 3 전까지)

// 배열 일부 수정/삭제/추가
arr.splice(1, 2, "a", "b"); // 인덱스 1부터 2개 제거하고 'a', 'b' 추가

// 배열 합치기
const arr2 = [6, 7];
const newArr = arr.concat(arr2); // [1, 2, 3, 4, 5, 6, 7]

2. 배열 탐색 메소드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const fruits = ["apple", "banana", "orange", "apple"];

// 요소 찾기
fruits.indexOf("apple"); // 0 (앞에서부터)
fruits.lastIndexOf("apple"); // 3 (뒤에서부터)
fruits.includes("banana"); // true

// 조건으로 찾기
const numbers = [1, 2, 3, 4, 5];

// 조건에 맞는 첫 요소
const found = numbers.find((num) => num > 3); // 4

// 조건에 맞는 첫 요소의 인덱스
const foundIndex = numbers.findIndex((num) => num > 3); // 3

// 조건을 만족하는지 확인
const hasEven = numbers.some((num) => num % 2 === 0); // true
const allEven = numbers.every((num) => num % 2 === 0); // false

3. 배열 변형 메소드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const numbers = [1, 2, 3, 4, 5];

// map: 각 요소를 변환
const doubled = numbers.map((num) => num * 2); // [2, 4, 6, 8, 10]

// filter: 조건에 맞는 요소만 선택
const evens = numbers.filter((num) => num % 2 === 0); // [2, 4]

// reduce: 값을 하나로 축소
const sum = numbers.reduce((acc, cur) => acc + cur, 0); // 15

// flatMap: map 후 평탄화
const pairs = numbers.flatMap((num) => [num, num * 2]);
// [1, 2, 2, 4, 3, 6, 4, 8, 5, 10]

// 정렬
const sorted = [...numbers].sort((a, b) => b - a); // 내림차순

4. 실전 활용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class ArrayUtils {
  // 중복 제거
  static removeDuplicates(arr) {
    return [...new Set(arr)];
  }

  // 배열 섞기
  static shuffle(arr) {
    return [...arr].sort(() => Math.random() - 0.5);
  }

  // 배열 그룹화
  static groupBy(arr, key) {
    return arr.reduce((groups, item) => {
      const value = item[key];
      groups[value] = groups[value] || [];
      groups[value].push(item);
      return groups;
    }, {});
  }

  // 배열 청크 분할
  static chunk(arr, size) {
    return Array.from({ length: Math.ceil(arr.length / size) }, (_, i) =>
      arr.slice(i * size, (i + 1) * size)
    );
  }
}

// 사용 예시
const numbers = [1, 2, 2, 3, 3, 4];
console.log(ArrayUtils.removeDuplicates(numbers)); // [1, 2, 3, 4]

const cards = ["♠A", "♥K", "♣Q", "♦J"];
console.log(ArrayUtils.shuffle(cards)); // 무작위 순서

const users = [
  { name: "Kim", age: 20 },
  { name: "Lee", age: 20 },
  { name: "Park", age: 30 },
];
console.log(ArrayUtils.groupBy(users, "age"));
// { '20': [{name: "Kim"...}, {name: "Lee"...}], '30': [{name: "Park"...}] }

const nums = [1, 2, 3, 4, 5, 6, 7];
console.log(ArrayUtils.chunk(nums, 3)); // [[1,2,3], [4,5,6], [7]]

5. 고급 배열 처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class DataProcessor {
  // 평균 계산
  static average(arr) {
    return arr.reduce((sum, num) => sum + num, 0) / arr.length;
  }

  // 중앙값 찾기
  static median(arr) {
    const sorted = [...arr].sort((a, b) => a - b);
    const mid = Math.floor(sorted.length / 2);
    return sorted.length % 2 === 0
      ? (sorted[mid - 1] + sorted[mid]) / 2
      : sorted[mid];
  }

  // 빈도수 계산
  static frequency(arr) {
    return arr.reduce((freq, item) => {
      freq[item] = (freq[item] || 0) + 1;
      return freq;
    }, {});
  }

  // 배열 차이 찾기
  static difference(arr1, arr2) {
    return arr1.filter((item) => !arr2.includes(item));
  }
}

// 사용 예시
const scores = [85, 90, 92, 88, 85];
console.log(DataProcessor.average(scores)); // 88
console.log(DataProcessor.median(scores)); // 88
console.log(DataProcessor.frequency(scores)); // { '85': 2, '88': 1, '90': 1, '92': 1 }
console.log(DataProcessor.difference([1, 2, 3], [2, 3, 4])); // [1]

6. 체이닝 패턴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class ArrayChain {
  constructor(arr) {
    this.arr = arr;
  }

  map(fn) {
    this.arr = this.arr.map(fn);
    return this;
  }

  filter(fn) {
    this.arr = this.arr.filter(fn);
    return this;
  }

  sort(fn) {
    this.arr = [...this.arr].sort(fn);
    return this;
  }

  value() {
    return this.arr;
  }
}

// 사용 예시
const result = new ArrayChain([1, 2, 3, 4, 5])
  .map((x) => x * 2) // [2, 4, 6, 8, 10]
  .filter((x) => x > 5) // [6, 8, 10]
  .sort((a, b) => b - a) // [10, 8, 6]
  .value();

console.log(result); // [10, 8, 6]

꿀팁! 🍯

  1. 성능 최적화
1
2
3
4
5
6
7
8
9
10
// 큰 배열에서 요소 찾기
const bigArray = [
  /* 많은 데이터 */
];

// BAD
const found = bigArray.filter((x) => x.id === 5)[0];

// GOOD
const found = bigArray.find((x) => x.id === 5);
  1. 배열 복사
1
2
3
4
5
6
// 얕은 복사
const copy1 = [...original];
const copy2 = original.slice();

// 깊은 복사
const deepCopy = JSON.parse(JSON.stringify(original));

이제 배열 메소드는 마스터! 😎 데이터 처리가 필요한 어떤 상황에서도 자신있게 코딩할 수 있을 거야!