2013-03-05 11 views
0

내가 소호 - 대시에 코드 블록을 변환하기 위해 노력하고있어 중첩 :사용 lodash 각

if(!event && callback){ 
    for(var ev in this._events){ 
    for (var i = 0; i < this._events[ev].length; i++) { 
     if(this._events[ev][i].callback === callback){ 
     this._events[ev].splice(i, 1); 
     } 
    } 
    } 
    return; 
} 

내가 그와 함께 시도했지만 나는 그것이 동작하지 않습니다 :

if(!event && callback){ 
    _.each(this._events, function(ev){ 
    _.each(ev, function(trigger, i, ev){ 
     if(trigger.callback === callback) ev.splice(i, 1); 
    }); 
    }); 
    return; 
} 

this._events 이런 식으로 구성되어 있습니다 :

this._events = { 
    ev1: [ 
    {callback: functions(){....}}, 
    {callback: functions(){....}} 
    ], 
    ev2.... 
} 
+0

문제를 설명하는 스 니펫과 함께 기능적인 예를 제공 할 수 있습니까? 최소한 이터레이터는 작동하는 것처럼 보입니다 : http://jsfiddle.net/rq7rJ/. –

답변

0

나는 변환에 직접적인 문제가있다 확신 아니에요,하지만 원래 코드에 결함이있는 것 같습니다 - 삭제하려는 두 개의 연속 기능이있는 경우 첫 번째 기능 만 제거됩니다. 뭔가를 삭제할 때마다 목록의 다음 항목을 건너 뜁니다 (어떤 이유에서든 콜백 일치를 따르는 항목을 확인하는 것과 무관하지 않다면 색인이 작동하도록 좀 더 영리해야합니다)). 대한 후,

if (!event && callback) { 
    for (var ev in this._events) { 
    for (var i = 0; i < this._events[ev].length; i++) { 
     if (this._events[ev][i].callback === callback) { 
     this._events[ev].splice(i, 1); 
     i--; 
     } 
    } 
    } 
    return; 
} 

는 다른 인덱스 조작 작업을 할 동안, 나는 더 많은 기능 프로그래밍 접근 방식을하고 고려할 것 (즉 lodash 밑줄 것입니다 : 이것은 원래의 코드에이 같은 일을 해결할 수 있습니다 모든) :

if (!event && callback) { 
    this._events = _.map(this._events, function(ev) { 
    return _.filter(ev, function(trigger, i, ev) { 
     return !(trigger.callback === callback); 
    }); 
    }); 
    return; 
} 

오히려 기존 데이터를 직접 조작 할 이상은, 함수형 프로그래밍은 기존 데이터의 불변성을 강조하고, 기존 데이터의 변경을 반영하기 위해 새로운 구조의 생성을 의존 일반적으로합니다. 따라서 기존 배열을 접합하는 대신 새 구조체를 생성하기 위해 이전 구조체를 사용하고 이전 구조체에 대한 참조를 새 구조체에 대한 참조로 대체합니다.

이것은 기능적 접근법의 동기를 설명하지 못하기 때문에보다 나은 디자인 결정이 될 수있는 이유에 대해 몇 가지 생각을 남깁니다. 이 경우 성능면에서 더 좋을 수 있습니다 (배열을 여러 번 접합하는 데는 비용이 많이 듭니다). 그러나 함수 프로그래밍의 더 중요한 부분은 변수를 상당히 많이 저글링 할 필요가 없으므로 코드가 더 견고해질 수 있다는 것입니다. 이것은 완벽한 예입니다. 기존 구조를 조작하기위한 색인 생성은 기존 함수가 상태 (예 :지도 및 필터)를 처리하는 것보다 정확하게 수행하는 것이 더 힘들어 색인 생성 오류가 발생했습니다.