【问题标题】:What is the JavaScript equivalent to Ruby's Enumerable#cycle?与 Ruby 的 Enumerable#cycle 等效的 JavaScript 是什么?
【发布时间】:2016-04-22 10:30:05
【问题描述】:

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

有人知道与 Ruby 的 Enumerable#cycle 等效的 JavaScript 吗?

上下文:我试图在 JavaScript 中循环相同的数组——两次。一旦迭代结束,我希望迭代从数组的开头开始并最终停止。停止部分并不难——这是我试图在 JavaScript 中实现的迭代循环。但是,使用上述方法,我已经能够在 Ruby 中做到这一点。

【问题讨论】:

  • 自己实现并不难。 Ruby 有非常丰富的标准库,所以我不希望每种方法的等价物存在于 JS 领域。连 lodash 和 underscore 似乎都没有。

标签: javascript ruby loops iterator


【解决方案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

【讨论】:

    【解决方案2】:

    没有内置的(甚至据我所知)没有 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);
        }
      }
    }
    

    您需要进行更多的错误检查才能使其更加健壮,但您明白了。 :)

    【讨论】:

    • 在向原型添加方法之前添加检查很有用(imo):if (!('cycle' in Array.prototype) {...
    猜你喜欢
    • 2015-06-12
    • 2018-07-17
    • 2023-02-16
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2021-10-06
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多