JavaScript 中 Ruby 的 each cons 的等价物
each_cons() - Ruby
enumerable 的 each_cons() 方法是 Ruby 中的内置方法,每次从每个元素开始迭代连续的 N 个元素。如果没有给出块,它将返回枚举器。
each_cons() 的 JS 等价物
假设我们有一个 Number 文字数组(在本例中是 Ruby 的 enumerable 的 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)。如果窗口稳定,我们将窗口(该子数组插入结果数组),将其向右滑动单位距离并折叠(即开始 = 结束)。如果窗口不稳定,我们会继续向其中添加元素。
这种方法的代码是 −
示例
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 ] ]
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

