Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript에서 Ruby의 각 단점과 동일

<시간/>

each_cons() - 루비

each_cons() enumerable 메소드는 매번 각 요소에서 시작하여 연속적인 N 요소를 반복하는 Ruby의 내장 메소드입니다. 블록이 주어지지 않으면 열거자를 반환합니다.

each_cons()에 해당하는 JS

Number 리터럴의 배열(이 경우 Ruby의 열거 가능한 JS와 동일)이 있다고 가정하면 each_cons 함수는 배열의 각 요소에 대해 실행되고 숫자 N(N <=배열의 길이)을 다음과 같이 받아들이는 Array 함수여야 합니다. 유일한 주장. 모든 요소에서 하나씩 시작하는 각 하위 배열과 함께 크기가 N인 하위 배열이 있는 배열을 반환합니다.

이에 대한 예를 보면 상황이 좀 더 명확해집니다.

다음과 같은 배열이 있다고 가정합니다 -

const arr = [1, 2, 3, 4, 5];
console.log(arr.eachCons(2));

eachCons에 대한 이 호출이 하는 일은 각각 다음과 같은 2개의 요소가 있는 배열의 배열을 형성한다는 것입니다. -

[[1, 2], [2, 3], [3, 4], [4, 5]]

할 수 있을 때까지 원본 배열의 각 요소에 대해 하위 배열이 생성됩니다.

N 값이 2가 아닌 3이었다면 결과는 다음과 같았을 것입니다. -

[[1, 2, 3], [2, 3, 4], [3, 4, 5]]

다시 말하지만, 배열에 요소가 충분할 때까지 배열의 모든 요소에 대해 하위 배열이 생성됩니다.

접근

이 문제를 해결하기 위해 슬라이딩 윈도우 알고리즘을 사용할 것입니다.

현대 ES6 기능을 사용하여 두 줄로 이 문제를 해결할 수 있지만 전자의 접근 방식은 후자에 비해 매우 효율적입니다.

먼저, 0에서 N 인덱스까지의 초기 창을 생성하는 while 루프를 사용할 것입니다. 그 다음에. 창의 끝이 여전히 원래 배열의 길이보다 짧은 동안 실행되는 for 루프를 사용할 것입니다.

이 루프는 창의 안정성을 확인합니다(즉, 창의 길이가 N과 동일함). 창이 안정적인 경우 창(결과 배열에 해당 하위 배열)을 삽입하고 단위 거리만큼 오른쪽으로 밉니다. 그것을 접습니다(즉, 시작 =끝). 창이 불안정하면 계속 요소를 추가합니다.

이 접근 방식의 코드는 -

예시

const arr = [1, 2, 3, 4, 5];
const eachCons = function(num){
   let res = [], temp = [];
   let start = 0, end = 0;
   while(end < num){
      temp.push(this[end++]);
   };
   for(; end <= this.length ;){
      if(temp.length === num){
         res.push(temp);
         start++;
         end = start;
         temp = [];
      }
      temp[end-start] = this[end];
      end++;
   }
   return res;
};
Array.prototype.eachCons = eachCons;
console.log([1, 2, 3, 4, 5].eachCons(1));
console.log([1, 2, 3, 4, 5].eachCons(2));
console.log([1, 2, 3, 4, 5].eachCons(3));
console.log([1, 2, 3, 4, 5].eachCons(4));

출력

콘솔의 출력은 다음과 같습니다. -

[ [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ] ]
[ [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 4, 5 ] ]
[ [ 1, 2, 3 ], [ 2, 3, 4 ], [ 3, 4, 5 ] ]
[ [ 1, 2, 3, 4 ], [ 2, 3, 4, 5 ] ]