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