Computer >> Máy Tính >  >> Lập trình >> Javascript

Tương đương với mỗi khuyết điểm của Ruby trong JavaScript

each_cons () - Ruby

each_cons () method of enumerable là một phương thức có sẵn trong Ruby, nó sẽ lặp lại N phần tử liên tiếp bắt đầu từ mỗi phần tử. Nếu không có khối nào được đưa ra, nó sẽ trả về điều tra viên.

JS tương đương của each_cons ()

Giả sử chúng ta có một mảng các ký tự Số (tương đương với JS tương đương với kiểu liệt kê của Ruby trong trường hợp này), hàm each_cons được cho là một hàm Mảng thực thi cho mỗi phần tử của mảng và chấp nhận một số N (N <=độ dài của mảng) như chỉ đối số. Và trả về một mảng với các mảng con có kích thước N với mỗi mảng con bắt đầu từ tất cả các phần tử một.

Một ví dụ về điều này sẽ làm cho mọi thứ rõ ràng hơn một chút.

Giả sử chúng ta có một mảng như thế này -

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

Điều mà lệnh gọi eachCons này thực hiện là, nó tạo thành một mảng các mảng với 2 phần tử mỗi phần như thế này -

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

Lưu ý rằng các mảng con được tạo cho từng phần tử của mảng ban đầu cho đến khi chúng ta có thể làm như vậy.

Nếu giá trị của N là 3 thay vì 2, kết quả sẽ có dạng -

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

Một lần nữa, các mảng con được tạo cho mọi phần tử của mảng cho đến khi chúng ta có đủ phần tử trong mảng.

Phương pháp tiếp cận

Chúng tôi sẽ sử dụng thuật toán cửa sổ trượt để giải quyết vấn đề này.

Mặc dù chúng ta có thể sử dụng các hàm ES6 hiện đại để giải quyết vấn đề này theo hai dòng, nhưng formerapproach rất hiệu quả so với hàm sau.

Đầu tiên, chúng ta sẽ sử dụng một vòng lặp while để tạo cửa sổ ban đầu của chúng ta từ 0 đến N chỉ mục. Sau đó. chúng ta sẽ sử dụng một vòng lặp for chạy trong khi phần cuối của cửa sổ vẫn nhỏ hơn độ dài của mảng gốc.

Vòng lặp này kiểm tra tính ổn định của cửa sổ của chúng ta (nghĩa là độ dài của cửa sổ của chúng ta bằng N). Nếu cửa sổ ổn định, chúng ta chèn cửa sổ (mảng con đó vào mảng kết quả), trượt nó sang bên phải theo đơn vị khoảng cách và thu gọn nó (tức là bắt đầu =kết thúc). Nếu cửa sổ không ổn định, chúng tôi tiếp tục thêm các thành phần vào đó.

Mã cho phương pháp này là -

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

Đầu ra

Đầu ra trong bảng điều khiển 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 ] ]