2010-05-18 2 views
1

에 대한 성가신은 :JQuery와 범위 유틸리티는 프로토 타입에서

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

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

JQuery와의 범위를 동등한이 있습니까

과 같이 쓸 수있다?

+5

흥미 롭. 또한 더 빨리 실행됩니다. –

+1

첫 번째 예제는 루프 변수 'i'를 현재 스코프 (또는이 스코프의 다른 곳에'var i '가 없을 경우 전역 스코프)에 넣는 단점이 있습니다. –

+0

인덱스가 아닌 숫자를 다루고 있기 때문에 위의 예제가 아닐 수도 있지만 콜렉션을 반복 할 때 'var i = 0; i Anurag

답변

3

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

jQuery를 기본적 범위 확장을 제공하지 않습니다 볼 수 있지만, 그것은 쉽게 추가합니다. 거기에는 두 부분 만 있습니다. 먼저 범위 함수는 범위의 각 항목이 배열 값으로 확장 된 배열을 반환해야합니다. 그런 다음 Array에 메서드를 추가하여 처리기 함수에서 전달되는 각 객체를 반복합니다.

여기서 우리는 배열을 반복하기 위해 ECMA-262 표준의 일부인 forEach을 정의합니다. 자세한 내용은 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 네임 스페이스 내의 배열로 확장하는 함수가 필요합니다. 위의 URL에서 촬영 (원본 소스 - http://blog.outofhanwell.com/2006/03/29/javascript-range-function/) :

$.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 
}); 
의 사용자 정의 단계 값을 사용

$.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; 
    } 
}); 

Alrighty, 지금 우리가 할 수있는

1

나는 배열에 발전기를 선호한다 - 더 우아하고 (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

관련 문제