TIL21 l Array APIs

Noma·2021년 1월 25일
0

1. Join

: 배열의 모든 요소를 연결해 하나의 문자열로 만든다.

  const fruits = ["apple", "banana", "orange"];
  const result = fruits.join();
  console.log(result); // 'apple, banana, orange'
}

2. Split

: String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눈다.
주어진 문자열을 separator마다 끊은 부분 문자열을 담은 Array를 반환함

{
  const fruits = "🍎, 🥝, 🍌, 🍒";
  const result = fruits.split(",");
  console.log(result);  // ["🍎", " 🥝", " 🍌", " 🍒"]
}

3. Reverse

: 배열의 순서를 반전한다. 첫 번째 요소는 마지막 요소가 되며 마지막 요소는 첫 번째 요소가 된다.

{
  const array = [1, 2, 3, 4, 5];
  const result = array.reverse();  
  
  // ❗ 배열자체와 리턴값 모두 변환시킨다.
  console.log(result);  // [5, 4, 3, 2, 1]
  console.log(array);  // [5, 4, 3, 2, 1]
}

4. Slice

arr.slice([begin[,end]])

: 어떤 배열의 begin부터 end까지(end 미포함)에 대한 복사본을 새로운 배열 객체로 반환한다. 원본 배열은 바뀌지 않는다.

매개변수

  • begin (Optional) : 0을 시작으로 하는 추출 시작점에 대한 인덱스를 의미

    • 음수 인덱스 : 배열의 끝에서부터의 길이
      e.g. slice(-2) 는 배열에서 마지막 두 개의 엘리먼트를 추출

    • undefined : 0번 인덱스부터 slice

    • 배열의 길이보다 큰 경우 : 빈 배열을 반환

  • end (Optional) : 추출을 종료 할 0 기준 인덱스, slice 는 end 인덱스를 제외하고 추출
    e.g. slice(1,4)는 두번째 요소부터 네번째 요소까지 (1, 2 및 3을 인덱스로 하는 요소) 추출

    • 음수 인덱스 : 배열의 끝에서부터의 길이
      e.g. slice(2,-1) 는 세번째부터 끝에서 두번째 요소까지 추출

      = 생략 : slice()는 배열의 끝까지(arr.length) 추출
      배열의 길이보다 큰 경우 : silce()는 배열의 끝까지(arr.length) 추출

반환 값
: 추출한 요소를 포함한 새로운 배열

{
  const array = [1, 2, 3, 4, 5];
  const result = array.slice(2, 5); 
  // index 2~4까지만 리턴
  console.log(result); // [3,4,5]
  console.log(array); // [1,2,3,4,5]
}

< 공용 예제 >
앞으로 나올 Find, Filter, Map,...에 해당하는 공통 예제이다.

class Student {
  constructor(name, age, enrolled, score) {
    this.name = name;
    this.age = age;
    <this.enrolled = enrolled;
    this.score = score;
  }
}
const students = [
  new Student("A", 29, true, 45),
  new Student("B", 28, false, 80),
  new Student("C", 30, true, 90),
  new Student("D", 40, false, 66),
  new Student("E", 18, true, 88),
];

5. Find

arr.find(callback[,thisArg])

: 주어진 판별 함수를 만족하는 "첫 번째 요소"의 값을 반환한다. 그런 요소가 없다면 undefined를 반환한다.

Q. 점수가 90인 학생을 찾아라.

{
  const result = students.find((student) => student.score === 90);
  console.log(result); 
// Student {name: "C", age: 30, enrolled: true, score: 90}
}

6. Filter

arr.filter(callback(element[,index[,array]])[,thisArg])

: 주어진 함수의 테스트를 통과하는 모든 "요소"를 모아 새로운 배열로 반환한다.

매개변수

  • callback
    : 각 요소를 시험할 함수. true를 반환하면 요소를 유지하고, false를 반환하면 버립니다. 다음 세 가지 매개변수를 받는다.

    • element : 처리할 현재 요소
    • index (Optional) : 처리할 현재 요소의 인덱스
    • array (Optional) : filter를 호출한 배열
  • thisArg (Optional)
    : callback을 실행할 때 this로 사용하는 값

반환 값
: 테스트를 통과한 요소로 이루어진 새로운 배열

Q. 등록된 학생들의 배열을 만들어라.

{
  const result = students.filter((student) => student.enrolled);
  console.log(result);
} 

</* [console]
0: Student {name: "A", age: 29, enrolled: true, score: 45}
1: Student {name: "C", age: 30, enrolled: true, score: 90}
2: Student {name: "E", age: 18, enrolled: true, score: 88}
*/

7. Map

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

: 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 "결과"를 모아 새로운 배열을 반환한다.

매개변수는 .filter와 같다( element=currentValue ).

Q. 오직 학생들의 점수만을 담은 배열을 만들어라.
result should be: [45, 80, 90, 66, 88]

{
  const result = students.map((student) => student.score);
  console.log(result);
} 

8. Some & Every

  • some() : 배열 안의 어떤 요소라도 주어진 판별 함수를 통과하는지 테스트한다. 하나라도 조건에 만족하면 true 리턴

  • every() : 배열 안의 모든 요소가 주어진 판별 함수를 통과하는지 테스트한다.

매개변수는 .filter와 같다( element=currentValue ).
반환값은 true, false 중 하나

❗ 참고
빈 배열에서 호출하면,
.some()은 무조건 false를 반환
.every()은 무조건 true를 반환

Q. 점수가 50점 미만인 학생이 존재하는지 확인하라.

{
  const result = students.some((student) => student.score < 50);
  console.log(result); // true
} 

9. Reduce

: 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다.

arr.reduce(callback[,initialValue])

매개변수

  • callback : 배열의 각 요소에 대해 실행할 함수로, 다음 네 가지 인수를 받는다.
    • accumulator : 누산기accmulator는 콜백의 반환값을 누적한다. 콜백의 이전 반환값이다.
      콜백의 첫 번째 호출이면서 initialValue를 명시된 경우 initialValue의 값이다.
    • currentValue : 처리할 현재 요소
    • currentIndex, array → Optional
  • initialValue (Optional) : callback의 최초 호출에서 첫 번째 인수에 제공하는 값.
    초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용한다.

반환 값
: 누적 계산의 결과 값

콜백의 최초 호출 때 accumulator와 currentValue는 다음 두 가지 값 중 하나를 가질 수 있다.

  • 만약 reduce() 함수 호출에서 initialValue를 제공한 경우, accumulator는 initialValue와 같고 currentValue는 배열의 첫 번째 값과 같다.
  • initialValue를 제공하지 않았다면, accumulator는 배열의 첫 번째 값과 같고 currentValue는 두 번째와 같다.

Q. 학생들의 평균 점수를 계산하라.

{
  const result = students.reduce((acc, cur) => acc + cur.score, 0); // 첫 콜백 호출시 acc=0, cur=45
  console.log(result / students.length);
} // 73.8

.reduceRight()은 배열의 반대쪽부터 누적

10. Sort

arr.sort([compareFunction])

: 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환한다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따르며, 정렬 속도와 복잡도는 각 구현방식에 따라 다를 수 있다.

매개변수

  • compareFunction (Optional) : 정렬 순서를 정의하는 함수. 생략하면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니코드 코드 포인트 값에 따라 정렬된다.

반환 값
: 정렬한 배열. 복사본이 만들어지는 것이 아니라 원 배열을 정렬한다.

설명

  • compareFunction이 제공되지 않으면,
    요소를 문자열로 변환하고 유니 코드 코드 포인트 순서로 문자열을 비교하여 정렬됩니다.
    e.g. 문자정렬: "바나나", "체리" , 숫자정렬: 80,9

  • compareFunction이 제공되면,
    배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다.

    a와 b가 비교되는 두 요소라면,

    • compareFunction(a, b) < 0: a, b
    • compareFunction(a, b) = 0: a와 b의 순서 변경하지 않음
    • compareFunction(a, b) > 0: b, a
const numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b)=> a - b);
console.log(numbers); // [1, 2, 3, 4, 5]

11. Chaining Array

Q. 학생들의 모든 점수를 포함한 문자열을 만들어라.
result should be: '45, 80, 90, 66, 88'

{
  const result = students
    .map((student) => student.score) // 학생들의 점수만 추출
    .filter((score) => score >= 50) // 그 중 조건에 해당하는 것만 필터링
    .join(); // 모든 요소 연결해 하나의 문자열로 만듬
  console.log(result); // '45, 80, 90, 66, 88'
}

Q. 위 문제의 결과를 오름차순으로 정렬하라.
result should be: '45, 66, 80, 88, 90'

{
  const result = students
    .map((student) => student.score)
    .sort((a, b) <=> a - b) // asc
    // .sort(( a, b) => b - a) // desc
    .join();
  console.log(result);
}

❗ 참고 자료
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
https://www.youtube.com/channel/UC_4u-bXaba7yrRz_6x6kb_w

profile
Frontend Web/App Engineer

0개의 댓글