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 ] ]
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP