JavaScript

[JavaScript] every() 와 some()

댕주 2024. 11. 9. 21:19

JavaScript의 내장 every 함수와 some 함수는 Array, Iterator, TypedAray에 각각 적용되어, 데이터 유형에 따라 일관되게 조건 검사를 수행할 수 있다.

  • every : 배열의 모든 요소가 조건을 만족할 때만 true 를 반환, 하나라도 조건에 맞지 않으면 false.
  • some : 배열의 요소 중 하나라도 조건을 만족하면 true 를 반환, 모든 요소가 조건에 맞지 않으면 false.
  • every 와 some 모두 콜백 함수를 통해 조건을 정의한다.

유의사항

Javascipr의 내장 everysome 함수는 Array와 TypedArray에서만 직접 사용할 수 있다

  • 이터레이터 객체 (Map, Set 등)에는 everysome 함수가 직접 제공되지 않으므로, 이터레이터의 값을 배열로 변환하여 사용할 수 있다.
  • 예를 들어, Set 객체에 대해 every 를 사용하려면, [...mySet.values()].every(...) 와 같이 변환 후 사용해야 한다. 

every

1. Array.prototype.every

일반 배열에서 every 를 호출하면, 배열의 각 요소가 지정한 조건을 모두 만족하는지 검사한다.

const numbers = [1, 2, 3, 4, 5]
const allPositive = numbers.every(num => num > 0); // true

 

2. Iterator.prototype.every

Javascript의 이터레이터 객체에서 every 를 호출할 수 있다. 이터레이터는 Map 이나 Set 과 같은 객체에서 .values() 또는 .entries() 메서드를 사용해 생성할 수 있는 객체로, 각 값을 순회할 수 있게 해준다.

const mySet = new Set([1, 2, 3, 4]);
const allEven = [...mySet].every(value => value % 2 === 0); // false

 

3. TypedArray.prototype.every

TypedArray는 정수나 부동소수점 숫자를 위한 배열로, Int8Array, Unit8Array 등의 형태로 사용된다. TypedArray 에서도 every 를 호출할 수 있다.

const typedArray = new Unit8Array([1, 2, 3]);
const allPositive = typedArray.every(num => num > 0); // true

 

각각의 every 는 배열처럼 데이터의 각 요소를 특정 조건으로 검사할 수 있도록 동일한 인터페이스를 제공하며, Array, Iterator, TypedArray 모두에서 유사하게 사용된다.


some

1. Array.prototype.some

일반 배열에서 some 을 호출하면, 배열 요소 중 하나라도 지정한 조건을 만족하는지 검사한다.

const numbers = [1, 2, 3, 4, 5];
const hasEven = numbers.some(num => num % 2 === 0); // true

 

2. Iterator.prototype.some

이터레이터 객체에서도 some 을 사용할 수 있다. 이터레이터는 Map 이나 Set 의 값이나 키-값 쌍을 순회할 때 사용된다.

const mySet = new Set([1, 3, 5, 7]);
const hasEven = [...mySet].some(value => value % 2 === 0); // false

 

3. TypedArray.prototype.some

TypedArray에서도 some 을 사용할 수 있다. 이 경우에도 모든 요소 중 하나라도 조건을 만족하면 true 를 반환한다.

const typedArray = new Unit8Array([1, 3, 5]);
const hasEven = typedArray.some(num => num % 2 === 0); // false

 

some 은 데이터 유형과 관계없이 특정 조건을 충족하는 요소가 하나라도 있는지 검사하는 동일한 메커니즘을 제공한다.

 


Lodash 와 JavaScript 의 내장 함수 every, some 는 어떻게 다를까?

  1. 적용 대상의 범위
    JavaScript 내장 함수 (Array.prototype.everyArray.prototype.some):
    - 배열에만 사용 가능하다
    - 배열의 모든 요소 또는 일부 요소가 특정 조건을 충족하는지 검사하는 용도로 사용된다

    Lodash_.every_.some:
    - 배열뿐만 아니라 객체, Map, Set 등 다양한 데이터 타입에 적용 가능하다
    - Lodash 함수들은 일반 객체나 JSON 구조에서도 조건 검사를 수행할 수 있어, 복잡한 데이터 구조에서의 유효성 검사를 더 유연하게 처리할 수 있다.

  2. 조건 처리의 유연성
    Lodash의 _.every, _.some 함수는 배열 외 객체를 다룰 때도 편리한 방식으로 조건을 설정할 수 있도록 지원한다.
    예를 들어, Lodash는 단순 조건 객체를 제공할 수 있다. ( _.every(items, { checked: true }) ). 이를 통해 JSON 데이터 내의 모든 객체에 특정 속성이 있는지 또는 특정 값이 설정되어 있는지 간단하게 검사할 수 있다.

예시 비교

  • JavaScript 내장 함수로 배열에서 모든 요소가 조건을 만족하는지 검사:
const array = [1, 2, 3, 4];
array.every(num => num > 0)
  • Lodash 함수로 객체에서 모든 속성이 조건을 만족하는지 검사:
const items = { a: 1, b: 2, c: 3 };
_.every(items, val => val > 0)