본문 바로가기

JavaScript

[JavaScript] every, some

알고리즘 문제를 풀다가 Array의 every와 some에 대해서 알게 되었다. 

 

every 

배열의 모든 요소가 특정 조건을 충족하는지 확인한다. 

const array = [10, 20, 30, 40, 50];

const result1 = array.every(num => num < 30);
console.log(result1) // false

const result2 = array.every(num => num >= 10);
console.log(result2) // true

인자로 특정 조건을 확인하는 callback 함수를 전달한다. 

이때 배열의 모든 요소가 해당 조건을 충족한다면 true / 아니라면 false가 리턴된다. 

 

some 

배열의 1개의 요소라도 특정 조건을 충족하는지 확인한다. 

const array = [10, 20, 30, 40, 50];

const result1 = array.some(num => num < 30);
console.log(result1) // true

const result2 = array.some(num => num >= 10);
console.log(result2) // true

every와 마찬가지고 특정 조건을 확인하는 callback 함수를 전달한다. 

이때 배열의 1개의 요소라도 조건을 충족한다면 true / 전부 충족하지 않는다면 false가 리턴된다. 

 

어떤 경우에 사용할까? 

바로 어제 작성한 숫자 카드 나누기 문제에서 every와 some을 사용하면 좀 더 깔끔하게 작성이 가능하다. 

( 깔끔하다의 차이지 실제 수행 자체는 동일 ) 

function getMaxValue (max, arrayA,arrayB) {
    for(let i = max; i > 0; i-- ) {
        let isOk = true;
        for(let j = 0; j < arrayA.length; j++) {
            const numA = arrayA[j];
            const numB = arrayB[j];

            if(numA % i !== 0 || numB % i === 0) {
                isOk = false;
                break;
            }
        }

        if(isOk) {
            return i
        }
    }
    
    return 0;
}

다음과 같이 코드가 있다고 생각하자 

for(let j = 0; j < arrayA.length; j++) {
    const numA = arrayA[j];
    const numB = arrayB[j];

    if(numA % i !== 0 || numB % i === 0) {
        isOk = false;
        break;
    }
}

잘 보면 앞서 배운 some과 every가 보인다. 

numA의 경우 i와 나누면 무조건 0이 나와야 하고,

numB의 경우는 i와 나누면 하나라도 0이 나오면 안된다.

 

그렇다면 every와 some을 사용해서 리팩토링해보자!

function getMaxValue (max, arrayA,arrayB) {
    for(let i = max; i > 0; i--) {
        if(arrayA.every(num => num % i === 0) && !arrayB.some(num => num % i === 0)) return i;
    }
    
    return 0;
}

numA와 numB를 각각 every와 some 사용해서 계산했다. 

 

다음과 같이 사용할 수 있지만, 이것은 성능상 이점이 있는 것이 아닌 가독성을 위한 방법이다. 

이것을 사용하더라도 성능상 이점은 없고 똑같이 for문을 사용한다는 것은 알아두자!

반응형