0

このコードブロックをLo-Dashに変換しようとしています。

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....
}
4

1 に答える 1

0

変換に直接的な問題があるとは思いませんが、元のコードに欠陥があるようです。削除しようとしている2つの連続した関数がある場合、最初の関数のみが削除されます。何かを削除するたびに、リスト内の次のアイテムをスキップします(何らかの理由でコールバックの一致に続くアイテムをチェックすることに無関心でない限り、インデックスを機能させるにはもう少し賢くする必要があります)。これは、元のコードに対して次のようにすることで修正できます。

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;
}

関数型プログラミングは、既存のデータを直接操作するのではなく、既存のデータの不変性を強調し、通常、既存のデータへの変更を反映するために新しい構造の作成に依存します。したがって、既存の配列を接続するのではなく、古い構造を使用して新しい配列を生成し、古い配列への参照を新しい配列への参照に置き換えます。

ただし、これは機能的アプローチの背後にある動機を完全には説明していないため、これがより優れた設計上の決定である理由について、いくつかの考えを残しておきます。この場合、パフォーマンスが向上する可能性があります(アレイを複数回スプライシングすると非常にコストがかかります)。ただし、関数型プログラミングのより重要な部分は、変数の状態をそれほど調整する必要がないことです。これにより、コードがより堅固になる可能性があります。これはこの完璧な例です。既存の構造を操作するためのインデックス作成は、既存の関数に状態(この場合はマップとフィルター)を処理させるよりも正しく実行するのが難しく、インデックス作成エラーが発生しました。

于 2013-03-05T23:00:28.093 に答える