Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Tương đương each_cons của Ruby trong JavaScript

each_cons() - Ruby

Phương thức each_cons() của Enumerable trong Ruby lặp qua N phần tử liên tiếp bắt đầu từ mỗi phần tử. Nếu không给 block, trả về enumerator.

JS equivalent của each_cons()

Giả sử mảng số, eachCons là method mảng nhận số N (<= độ dài mảng), trả về mảng các mảng con kích thước N, mỗi mảng con bắt đầu từ từng phần tử lần lượt.

Ví dụ: [1,2,3,4,5].eachCons(2) => [[1,2],[2,3],[3,4],[4,5]]. N=3 => [[1,2,3],[2,3,4],[3,4,5]].

Cách tiếp cận

Dùng thuật toán sliding window. While loop tạo cửa sổ ban đầu 0..N. For loop trượt cửa sổ: nếu cửa sổ ổn định (độ dài N) => push kết quả, trượt phải 1 đơn vị, collapse (start=end). Nếu không ổn định => mở rộng cửa sổ.

Ví dụ

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));

Kết quả

Đầu ra trong console sẽ là:

[ [ 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 ] ]