JavaScript 中 Ruby 的 each cons 的等价物

javascriptweb developmentobject oriented programming更新于 2025/10/8 14:36:17

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

相关文章


有用资源