[JavaScript] 배열 내 원소의 조건에 따른 참, 거짓 판단하기 - some, every

 



배열 내 원소의 유효성검증(?)을 하던 도중,

매번 반복문만 쓰던 것에 질려 찾게된 some, every 입니다.

용도에 따라 활용도 있게 잘 사용했었는 데, 언듯 다시보니 IE에서도 사용할 수 있었습니다.

간단한 예제들과 함께 some, every에 대해 살펴봅니다.



1. 기본적인 사용예제

let f_arr = [true, false, true];

console.log("[DEBUG] 'some'  f_arr : ", f_arr.some(dt=>dt));
console.log("[DEBUG] 'every' f_arr : ", f_arr.every(dt=>dt));

람다식을 사용한 예로, 람다식에 해당하는 조건이 참(true)값을 갖을 경우에 따라

Array.prototype.some() 일부 원소가 참인 경우 true값을

Array.prototype.every() 모든 원사가 참인 경우 true값을 반환합니다.


2. 함수형 예제

f_arr.some((element, index, array) => { 
console.log(`순회  현재요소 : ${element} / 순회 순번 : ${index} / 대상 배열 ${array}`) 
});


* 출력결과

함수식의 경우 인자(Parameter)로 다음 세 가지를 갖습니다.

  • element : 순회 중 현재 배열원소
  • index : 배열 순회 인덱스
  • array : 순회 대상인 배열



3. 사용 예제 (스케쥴러 흉내내기)

 이전에 아래와 비슷한 형태의 스케쥴러를 구현한 기억을 더듬어 만든 예제입니다.

이번 포스팅 주제에 어울리는 부분은 3개의 interval(job)이 모두 완료될 때를 체크하는 부분입니다. 

const RUNNING = "Running";
const WAITING = "Waiting";
const FINISH = "Finish";

class Work {
  #state = WAITING;
  #runningTime = null;
  #workTime = null;

  constructor(time) {
    this.#workTime = time * 5 ?? 0;
  }

  get state() {
    return this.#state;
  }

  start() {
    let that = this;
    let interval = setInterval(function () {
      if (that.#runningTime++ < that.#workTime) {
        that.#state = RUNNING;
      } else {
        that.#state = FINISH;
        clearInterval(interval);
      }
    }, 1000);
  }
}

{
  let workingset = new Array();

    for (let i = 1; i <= 3; i++) {
      workingset.push(new Work(i));
    }

    for (let i = 0; i < 3; i++) {
      workingset[i].start();
    }

    let check = setInterval(() => {
      if (workingset.some((work) => work.state == RUNNING)) {
        console.log("[DEBUG] Running ... ");
      }

      if (workingset.every((work) => work.state == FINISH)) {
        console.log("[DEBUG] Finish ... ");

        clearInterval(check);
      }
    }, 1000);
}

0 댓글