Перечисление через массив JS в jQuery - PullRequest
4 голосов
/ 26 июня 2010

ОК. Эксперты jQuery: Итак ... Я работаю на фоне прототипа.

Я все время делаю следующий код (или какой-то похожий вариант):

MyObject.prototype.someFunction = function()
{
  var myArray = ["a","b","c"];
  myArray.each(function(arrayEntry)
    {
      this.printPart(arrayEntry);
    }, this);
}

MyObject.prototype.printPart = function(part)
{
  console.log(part);
}

Iпросматриваю документы jQuery - я не вижу, как это сделать.

Возможно ли это?

В частности, меня интересует:

  • Итерация по массивам javascript (объекты тоже подойдут).
  • Поддержание области видимости.Обратите внимание на последний параметр «this» для каждой функции.

Ответы [ 2 ]

5 голосов
/ 26 июня 2010

Вы ищете $.each(array, function(i, element) { ... })

Это также обрабатывает объекты, в этом случае вы получаете (key, value) в аргументах.

edit - к сожалению, естьничего похожего на inject Прототипа, и я очень скучаю по этому.Но в jQuery есть map, и это похоже на collect в Prototype.

отредактируйте снова - Как @Nick указывает в своем комментарии, Prototype и jQuery не согласны сЛучший способ справиться с обработкой "это".Как правило, jQuery вызывает функции-обработчики с этим, указывая на очевидный соответствующий объект.Прототип является более непринужденным, насколько это возможно.

1 голос
/ 26 июня 2010

Вам не обязательно делать все в jQuery. Просто добавьте метод forEach, если он еще не существует, и используйте его вместо этого. Это было так хорошо, что ECMAScript 5-е изд. принял его как стандарт (вдохновленный каждым методом Prototype), но еще не во всех браузерах он есть :). Вот реализация спецификации, которую вы можете использовать, пока она не будет у всех браузеров ( взята из MDC ):

Редактировать : последние версии Chrome, Safari, Firefox и Opera уже поддерживают это. Нет доступа к IE, извините.

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

Затем используйте свой код как есть (измените each на forEach):

var myArray = ["a","b","c"];

myArray.forEach(function(arrayEntry) {
    this.printPart(arrayEntry);
}, this);
...