알고리즘 문제를 풀다가 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문을 사용한다는 것은 알아두자!
반응형
'JavaScript' 카테고리의 다른 글
[JavaScript] ??와 || 의 차이 (0) | 2023.04.09 |
---|---|
[JavaScript] then vs Async/Await (0) | 2023.01.27 |
[JavaScript] 재귀함수 vs 반복문 (1) | 2022.12.29 |
[JavaScript] 배열에서 연속적인 숫자 뽑아내기 (0) | 2022.12.22 |
[JavaScript] 함수형 프로그래밍 - 함수형으로 전환하기_1 (0) | 2022.11.13 |