JavaScript 中 Ruby 的 each_cons 等價物


each_cons() - Ruby

each_cons() 方法是 Ruby 中可列舉物件的一個內建方法,它每次都從每個元素開始迭代連續的 N 個元素。如果未提供塊,則返回列舉器。

each_cons() 的 JS 等價物

假設我們有一個數字字面量的陣列(在本例中是 Ruby 中可列舉物件的 JS 等價物),each_cons 函式應該是一個數組函式,它對陣列的每個元素執行,並接受一個數字 N(N <= 陣列長度)作為唯一引數。並返回一個包含大小為 N 的子陣列的陣列,每個子陣列都從所有元素依次開始。

一個例子可以使事情更清楚一些。

假設我們有一個這樣的陣列:

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

對 eachCons 的此呼叫所做的是,它形成一個包含 2 個元素的陣列的陣列,如下所示:

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

請注意,為原始陣列的每個元素建立子陣列,直到我們能夠這樣做。

如果 N 的值為 3 而不是 2,則結果將如下所示:

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

同樣,為陣列的每個元素建立子陣列,直到陣列中有足夠的元素。

方法

我們將使用滑動視窗演算法來解決此問題。

雖然我們可以使用現代 ES6 函式在兩行中解決此問題,但前一種方法與後一種方法相比效率更高。

首先,我們將使用一個 while 迴圈來建立我們從 0 到 N 索引的初始視窗。然後,我們將使用一個 for 迴圈,它在我們的視窗的末尾仍然小於原始陣列的長度時執行。

此迴圈檢查視窗的穩定性(即視窗的長度等於 N)。如果視窗穩定,我們將視窗(即子陣列)插入到結果陣列中,將其向右滑動一個單位距離並將其摺疊(即 start = end)。如果視窗不穩定,我們將繼續向其中新增元素。

此方法的程式碼如下:

例子

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

更新於:2020-08-25

287 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.