代码之家  ›  专栏  ›  技术社区  ›  clyfe

用于快速迭代的jquery range实用程序(原型的$R等价物)

  •  2
  • clyfe  · 技术社区  · 15 年前

    在原型中,麻烦的是:

    for (i=0; i<10; i++) { ... }
    

    可以写为

    $R(0, 10).each(function(i){ ... });
    

    jquery中是否有等效的范围?

    2 回复  |  直到 13 年前
        1
  •  4
  •   Anurag    15 年前

    http://code.google.com/p/jquery-utils/source/browse/trunk/src/jquery.arrayUtils.js?r=452

    jquery本机不提供范围扩展,但它是一个简单的添加。它只有两部分。首先,range函数应该返回一个数组,该数组中的每个项都扩展为数组值。下一步将方法添加到 Array 迭代传入处理程序函数的每个对象。

    这里我们定义 forEach 这是用于迭代数组的ECMA-262标准的一部分。见 MDC 了解更多详细信息。

    if (!Array.prototype.forEach) {
      Array.prototype.forEach = function(fun /*, thisp*/) {
        var len = this.length >>> 0;
        if (typeof fun != "function")
          throw new TypeError();
    
        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
          if (i in this)
            fun.call(thisp, this[i], i, this);
        }
      };
    }
    

    接下来,我们需要一个函数来将范围扩展到jquery名称空间中的数组。取自上述网址(原始来源- http://blog.outofhanwell.com/2006/03/29/javascript-range-function/ ) :

    $.extend({
        // Returns a range object
        // Author: Matthias Miller
        // Site:   http://blog.outofhanwell.com/2006/03/29/javascript-range-function/
        range:  function() {
            if (!arguments.length) { return []; }
            var min, max, step;
            if (arguments.length == 1) {
                min  = 0;
                max  = arguments[0]-1;
                step = 1;
            }
            else {
                // default step to 1 if it's zero or undefined
                min  = arguments[0];
                max  = arguments[1]-1;
                step = arguments[2] || 1;
            }
            // convert negative steps to positive and reverse min/max
            if (step < 0 && min >= max) {
                step *= -1;
                var tmp = min;
                min = max;
                max = tmp;
                min += ((max-min) % step);
            }
            var a = [];
            for (var i = min; i <= max; i += step) { a.push(i); }
            return a;
        }
    });
    

    好吧,现在我们可以:

    $.range(2, 10).forEach(function(v) {
        console.log(v); // 2, 3, 4, .., 9
    });
    

    或将其与自定义步骤值(而不是1)一起使用

    $.range(2, 20, 4).forEach(function(v) {
        console.log(v); // 2, 6, 10, 14, 18
    });
    
        2
  •  1
  •   Danny W. Adair    14 年前

    比起阵列,我更喜欢发电机-更优雅(imho)和更节省内存。

    function Range(low, high){
      this.low = low;
      this.high = high;
    }
    Range.prototype.__iterator__ = function(){
      for (var i = this.low; i <= this.high; i++)
        yield i;
    };
    

    那么你可以简单地

    var range = new Range(3, 5);
    for (var i in range)
      print(i); // prints 3, then 4, then 5 in sequence
    

    来自: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Iterators_and_Generators