Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 유사한 키를 가진 배열 값 합계 구하기

예를 들어, 어떤 회사가 일정 기간 동안 매수·매도한 주식에 대한 데이터가 담긴 배열이 있다고 가정해 보겠습니다.

const transactions = [
    ['AAPL', 'buy', 100],
    ['WMT', 'sell', 75],
    ['MCD', 'buy', 125],
    ['GOOG', 'sell', 10],
    ['AAPL', 'buy', 100],
    ['AAPL', 'sell', 100],
    ['AAPL', 'sell', 20],
    ['DIS', 'buy', 15],
    ['MCD', 'buy', 10],
    ['WMT', 'buy', 50],
    ['MCD', 'sell', 90]
];

우리는 이 데이터를 입력받아 다음과 같은 객체를 반환하는 함수를 작성하려고 합니다. 객체의 키는 주식 이름(예: 'AAPL', 'MCD')이고, 값은 두 개의 숫자로 이루어진 배열입니다. 이때 첫 번째 요소는 해당 종목의 총 매수량을, 두 번째 요소는 총 매도량을 나타냅니다.

접근 방식

이 문제는 JavaScript의 reduce() 메서드를 활용하면 깔끔하게 해결할 수 있습니다. 배열을 순회하면서 각 거래 정보를 구조 분해 할당으로 추출하고, 누적 객체(acc)에 해당 종목의 키가 이미 존재하는지 여부에 따라 값을 갱신하거나 새로 생성하면 됩니다.

예제

const transactions = [
    ['AAPL', 'buy', 100],
    ['WMT', 'sell', 75],
    ['MCD', 'buy', 125],
    ['GOOG', 'sell', 10],
    ['AAPL', 'buy', 100],
    ['AAPL', 'sell', 100],
    ['AAPL', 'sell', 20],
    ['DIS', 'buy', 15],
    ['MCD', 'buy', 10],
    ['WMT', 'buy', 50],
    ['MCD', 'sell', 90]
];
const digestTransactions = (arr) => {
    return arr.reduce((acc, val, ind) => {
        const [stock, type, amount] = val;
        if(acc[stock]){
            const [buy, sell] = acc[stock];
            if(type === 'buy'){
                acc[stock] = [buy+amount, sell];
            }else{
                acc[stock] = [buy, sell+amount];
            }
        }else{
            if(type === 'buy'){
                acc[stock] = [amount, 0];
            }else{
                acc[stock] = [0, amount];
            }
        }
        return acc;
    }, {});
};
console.log(digestTransactions(transactions));

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

{
    AAPL: [ 200, 120 ],
    WMT: [ 50, 75 ],
    MCD: [ 135, 90 ],
    GOOG: [ 0, 10 ],
    DIS: [ 15, 0 ]
}

코드 설명

동작 과정을 단계별로 살펴보면 다음과 같습니다.

1. reduce()의 초기값으로 빈 객체 {}를 지정합니다.
2. 각 거래 항목에서 종목명(stock), 거래 유형(type), 수량(amount)을 구조 분해 할당으로 꺼냅니다.
3. 누적 객체에 해당 종목의 키가 이미 존재하면 기존의 매수·매도 합계를 가져와 현재 수량을 더해 갱신합니다.
4. 키가 존재하지 않는 첫 거래라면, 거래 유형에 따라 [amount, 0](매수) 또는 [0, amount](매도) 형태로 새 항목을 만듭니다.
5. 모든 순회가 끝나면 종목별 총 매수량과 총 매도량이 정리된 객체가 반환됩니다.

이처럼 reduce()를 사용하면 반복문 없이도 복잡한 데이터 집계 로직을 간결하고 가독성 좋게 구현할 수 있습니다.