2011-07-02 5 views
1

すべてのフォームフィールドでイベントを発生させるために、プロトタイプ関数を使用してデータコントロールを開始します。配列の内容の中で現在のオブジェクトid obj.idのフィールドの型が見つかった場合は、listdatatypesになります。さらに、いくつかの正規表現のコントロールに進みます(もちろん、PHPオーバーレイがありますが、Ajaxはありません)すべてを記録するのを避けるため)。プロトタイプ関数の伝達を中断する

これは魅力的ですが、ニードルが見つかったらアレイニードルの探索(例:プロトタイプ2)の伝播を中断する方法が不思議です。ここで

は、コードの原則である:forEachループを破壊することができるならば、あなたが求めている場合は

// proto 1 
if (!String.prototype.Contains) { 
    String.prototype.Contains = function(stack) { 
     return this.indexOf(stack) != -1; 
    }; 
} 

// proto 2 
if (!Array.prototype.forEach) { 
    Array.prototype.forEach = function(my_callback) 
    { 
    var len = this.length; 
    if (typeof my_callback != "function") 
     throw new TypeError(); 

    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in this) 
      my_callback.call(thisp, this[i], i, this); 
    } 
    }; 
} 

// ... main code abstract 

      function str_search(element, index, array){ 
     // Store the found item ... and would like to stop the search propagation 
      if (element.Contains(obj.id)) 
       stored_id = obj.id; 
      } 
      listdatatypes.forEach(str_search) ; 


// ... 

Thxを

答えて

1

、答えはノーです。

関数の中でコードの主要部分を無効にするためにフラグを設定することはできますが、それはそれです。ループは最後まで続きます。

ループを中断する場合は、従来のforループを使用するか、関数の戻り値に基づいて壊れる可能性のあるカスタムのforEachタイプのメソッドを記述します。


EDIT:

は、ここでは、falseを返す際に壊しwhileです。

Array.prototype.while = function(my_callback) { 
    var len = this.length; 
    if (typeof my_callback != "function") throw new TypeError(); 

    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) { 
     if (i in this) { 
      var ret = my_callback.call(thisp, this[i], i, this); 
      if (ret === false) { 
       break; 
      } 
     } 
    } 
}; 

あなたのコード:

function str_search(element, index, array){ 
    if (element.Contains(obj.id)) { 
     stored_id = obj.id; 
     return false; 
    } 
} 
listdatatypes.while(str_search); 
+0

Thxを、私は... – hornetbzz

+1

@hometbzzを期待していた:私はあなただけだろう考え出し伝統的なループのために行く。 'try/catch'ハックに頼る必要はありません。ここに 'while'関数があります。ループを壊すために 'false false;を返すだけです。 – user113716

+0

thx、これはさらに優れた提案です。私はそのようには思えませんでした。いつも同じように私の鼻の端を見ると、 – hornetbzz

1

次のハックは技術的に動作します:

var arr = [1, 2, 3, 4]; 
try { 
    arr.forEach(function (i) { 
    if (i > 2) throw 0; 
    } 
} catch (e) { 
    if (e !== 0) throw e; 
} 
+0

thx、良いハックに見える、私はその方向を試してみましょう。 – hornetbzz

関連する問題