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