什么是相当于Ruby的Enumerable#循环的JavaScript?

时间:2016-04-22 10:30:06

标签: javascript ruby loops iterator

在Ruby中,有一个名为Enumerable#cycle的方法,它允许在集合中重复循环x次。我在JavaScript中寻找类似的东西,却找不到相同的东西。

有没有人知道相当于Ruby的JavaScript,Enumerable #cycle?

上下文:我试图在JavaScript中循环遍历同一个数组 - 两次。一旦迭代到达终点,我希望迭代从数组的开头开始并最终停止。停止部分并不难 - 它是我尝试在JavaScript中实现的迭代循环。但是,我已经能够在Ruby中使用所述方法执行此操作。

2 个答案:

答案 0 :(得分:1)

我认为没有任何内置的内容与此相同,但如果您需要,可以按照这篇文章获取更多详细信息:

Javascript call a function several times with the arguments

除了那里提供的选项外,您还可以扩展Array.prototype以启用此方法:

Array.prototype.cycle = function (n, callback) {
    for (var i = 0; i < n; i++) {
        this.forEach(callback);
    }
}

并且,可以使用如下:

a = [1, 2, 3, 4]
a.cycle(2, function (i) { console.log(i); });
// this will print all the values two times

答案 1 :(得分:1)

没有内置的JavaScript(甚至是我所知的)可以做到这一点。但是,要完成自己并不难。

让我们假设你谈论阵列一分钟,让我们放弃关于修改原型的讨论。你想要的简单版本可能是:

Array.prototype.cycle = function(cycleCount, callback) {
  for(var i = 0; i < cycleCount; i++) {
    this = this.map(callback);
  }
}

假设你有一组数字。然后你可以这样做:

myNumberArray.cycle(2, function(num, i) {
  return num * 2;
});

我们甚至可以获得幻想,让您为每个周期指定不同的操作:

Array.prototype.cycle = function(cycleCount, callback) {
  if(Object.prototype.toString.call( callback ) === '[object Array]') {
    if(callback.length === cycleCount) {
      for(var i = 0; i < cycleCount; i++) {
        this = this.map(callback[i]);
      }
    } else {
      // Uhoh, we don't have the right number of callbacks
      throw new Error('If using multiple callbacks, the umber of callback\'s must match the number of cycles');
    }
  } else {
    for(var i = 0; i < cycleCount; i++) {
      this = this.map(callback);
    }
  }
}

你需要做更多的错误检查才能做到这一点,但你明白了。 :)