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