본문 바로가기
카테고리 없음

자바스크립트의 Array API

by 계발자jessie 2023. 5. 11.
반응형

map()

배열 내에 있는 모든 요소들에 대해 함수를 호출한 후의 결과를 모아 새로운 배열 형태로 반환한다.

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

const result = numbers.map(function(number) {
    return number * 2;
});
console.log(result);

// 화살표함수로 변경
const result = numbers.map((number) => {
    return number * 2;
});

// 단축형태
const result = numbers.map((number) => number * 2);

numbers라는 배열에 1부터 7까지의 숫자를 담고, 이 배열을 map()을 통해 콜백함수에서 2배로 만들었다. 그리고 결과를 출력하면 기존의 numbers 배열의 요소들에서 2를 곱한 결과값이 출력된다.

class Student {
    constructor(name, korean, english, math) {
        this.name = name;
        this.korean = korean;
        this.english = english;
        this.math = math;
    }
}

const student1 = new Student('홍길동', 95, 87, 100);
const student2 = new Student('김길동', 96, 86, 75);
const student3 = new Student('박길동', 97, 85, 70);
const student4 = new Student('오길동', 98, 84, 68);

const students = [student1, student2, student3, student4];

console.log(
    '영어점수', 
    students.map((student) => student.english)
);

console.log(
    '학생이름', 
    students.map((student) => student.name)
);

Student 클래스를 만들고 name, korean, english, math를 요소로 추가한다. 4명의 인스턴스를 만들고 각각 이름, 국어점수, 영어점수, 수학점수를 추가해 주고 이들을 students라는 배열에 담아준다. 그 후 students 배열을 map()을 사용해서 각 요소들의 영어 점수와 학생이름을 출력한다. map()을 통해 영어점수와 학생이름은 새로운 배열로 만들어지는 것을 확인할 수 있다.

 

some()

some() 메서드는 배열 안의 요소가 주어진 판별 함수를 통과하는지 여부를 테스트한다. 

const fluits = ['사과', '딸기', '배', '참외', '딸기', '수박'];

console.log('과일 중에 배가 있나요?',
    fluits.some((fluit) => {
        return fluit === '배';
    })
)

위의 코드는 여러 과일들을 fluits 배열에 담은 후 some() 메서드를 통해 '배'라는 요소가 있는지 확인하는 코드이다. some() 메서드는 요소들을 한 번씩 순회를 하면서 한 번이라도 결괏값이 true가 되면 true를 반환한다. 

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

console.log('숫자 중에 7 이상인 숫자가 있나요?',
    numbers.some((number) => number >= 7)
)

1부터 7까지로 이루어진 numbers 배열의 요소를 확인해서 7 이상의 숫자가 있는지 확인하는 코드이다. 7이라는 숫자가 7 이상이 되기 때문에 true가 출력된다. 

class Student {
    constructor(name, korean, english, math) {
        this.name = name;
        this.korean = korean;
        this.english = english;
        this.math = math;
    }
}

console.log('수학 점수가 100점인 학생이 있나요?',
    students.some((student) => student.math === 100)
)

console.log('영어 점수가 50점 미만인 학생이 있나요?',
    students.some((student) => student.english < 50)
)

수학 점수가 100점인 학생과 영어 점수가 50점 미만인 학생을 출력하는 코드이다. 

위의 코드들의 결과는 각각 true, true, true, false로 출력되는 것을 확인할 수 있다. 

 

추가)

console.log('과일 중에 배가 있나요?',
    fluits.some((fluit, index) => {
        console.log('index :', index, 'fluit :', fluit);
        return fluit === '배';
    })
)

some() 메서드의 두 번째 인자로는 index를 받을 수 있다. 위의 예시에서와 같이 '배'라는 데이터가 있으면 true를 출력하도록 했을 때 

index가 2일 때까지만 요소들을 순회하는 것을 확인할 수 있다. 이는 some() 메서드를 통과할 때 하나라도 true가 되면 true를 반환하기 때문에 index 2에서 이미 true가 반환되어 더 이상 순회를 돌 필요가 없기 때문이다. 

 

every()

every() 메서드는 some()과 달리 배열 안에 있는 모든 요소들이 판별 함수를 통과하는지 확인한다. 

console.log('숫자가 모두 8 이하 인가요?',
    numbers.every((number) => number <= 8) // true    
)

numbers 배열에 있는 숫자들이 모두 8 이하인지 확인하는 메서드이다. numbers 배열의 경우 1부터 7까지의 숫자로 이루어져 있기 때문에 true가 반환된다. 즉, 모든 요소가 true를 반환했기 때문에 true인 것이다. 만약 number <= 6으로 테스트했다면 7이라는 요소가 false가 되기 때문에 결과값은 false로 반환된다. 

 

filter()

filter() 메서드는 테스트를 통과한 요소들을 모아 새로운 배열을 반환한다.

console.log('짝수만 출력',
    numbers.filter((number) => number % 2 === 0) // [2, 4, 6]
)

console.log('홀수만 출력',
    numbers.filter((number) => number % 2 === 1) // [1, 3, 5, 7]
)

filter() 메서드를 이용해서 numbers 배열의 홀수, 짝수만 따로 출력하는 코드를 만들었다. 나머지가 0인 경우 짝수로, 1인 경우 홀수로 출력되도록 한 결과 새로운 배열이 만들어진 것을 확인할 수 있다.

 

reduce()

배열에 있는 각 요소들에 대해서 리듀서 함수를 실행한 후 하나의 결과값을 반환하는 메서드이다. 리듀서 함수는 누적값, 현재값, 현재 인덱스, 원본 배열의 매개변수를 가진다. 

numbers.reduce((acc, cur, idx, src) => {
    console.log('acc :', acc, 'cur :', cur, 'idx :', idx, 'src :', src);
    return acc;
}, 0);

위의 코드에서 매개변수는 각각 누적값, 현재값, 현재 인덱스, 원본 배열이다. 0을 초기값으로 준 상태이다. 

코드 실행 결과 누적값은 0으로 초기화된 상태이고 현재값은 배열 안에 있는 요소들이 출력되는 것이고 인덱스는 배열의 인덱스를 출력하는 것이다. 누적값은 결과로 반환한 값을 다시 매개변수로 넣어주게 된다. 

const result = numbers.reduce((acc, cur, idx, src) => {
    console.log('acc :', acc, 'cur :', cur, 'idx :', idx, 'src :', src);
    return acc + cur;
}, 0);

console.log(result);

이를 활용해서 1부터 7까지의 값을 더하는 코드를 작성하였다. 처음의 누적값은 0, 현재값은 1인 상태로 순회가 시작된다. 그 후 누적값이 1, 현재값이 2가 되고 순회를 한 번 더 돌게 되면 매개변수 acc로 1이 들어가게 되고 결과적으로 누적값이 1+2가 되면서 3이 된다. 이렇게 순회가 반복되면 1부터 7까지 더한 값이 결과값으로 출력된다. 

 

추가) reduce()를 활용해 중복값 제거하기

console.log(fluits);
const result = fluits.reduce((acc, cur) => {
    console.log('acc :', acc, 'cur :', cur);
    if (acc.includes(cur) === false) {
        acc.push(cur);
    }
    return acc;
}, []);

console.log(result);

reduce()를 사용하면 배열에 있는 중복값을 제거할 수 있다. 

 

fluits 배열은 원래 '딸기'라는 요소가 두 번 들어가 있었다. 이때, reduce()를 사용해서 누적값에 현재값이 있는 없는 경우에만 누적값으로 추가하고 있는 경우 누적값을 그대로 반환하는 코드를 작성했다. 그 결과 '딸기'의 경우 이미 존재하기 때문에 한 번 더 추가되지 않고 그대로 누적값이 반환되고 결과적으로는 '딸기' 요소가 하나 빠진 상태로 결과값이 정해진다. 

첫 번째 누적값(acc)의 경우 초기값으로 지정한 배열([])이 된다. 그 후 현재값들이 계속해서 누적이 되고 '딸기'라는 값이 다시 현재값이 되었을 때 이를 건너뛰고 결과 배열이 만들어지는 것을 볼 수 있다.

 

 

 

출처 : https://www.inflearn.com/course/lecture?courseSlug=%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EB%82%A0%EA%B0%9C%EB%8B%AC%EA%B8%B0&unitId=115149 

반응형

댓글