Прерывание распространения прототипа функции - PullRequest
1 голос
/ 03 июля 2011

Запуская события в каждом поле формы, я запускаю управление данными, используя функции прототипа.Если он находит тип поля текущего идентификатора объекта obj.id среди содержимого массива listdatatypes , то он переходит далее к некоторым элементам управления регулярных выражений (конечно, есть наложение phpно без Ajax, так как я хотел бы избежать перекодирования всего).

Это работает как талисман, но мне интересно, как прервать распространение поиска стрелки массива (например, так называемый прототип)2 ) после того, как игла была найдена.

Вот кодовый принцип:

// 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

Ответы [ 2 ]

1 голос
/ 03 июля 2011

Технически сработает следующий хак:

var arr = [1, 2, 3, 4];
try {
  arr.forEach(function (i) {
    if (i > 2) throw 0;
  }
} catch (e) {
  if (e !== 0) throw e;
}
1 голос
/ 03 июля 2011

Если вы спрашиваете, можно ли прервать цикл forEach, ответ - нет.

Вы можете установить флаг в функции, которую вы передаете, чтобы отключить основную часть кода, но это все. Цикл продолжится до конца.

Если вы хотите разорвать цикл, используйте вместо него традиционный цикл for или напишите пользовательский метод forEach, который можно прерывать на основе возвращаемого значения аргумента вашей функции.


EDIT:

Вот while, который ломается, когда вы возвращаете false.

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