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

更新于:2020-08-25

287 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告