проблемы с объектом jQuery и циклом - PullRequest
1 голос
/ 04 октября 2011

Я сейчас создаю плагин jQuery, который превращает <select> в довольно выпадающее меню, но у меня возникла небольшая проблема, хотя, я могу получить параметры выбора на странице, выполнив это

var self = $(this);
    name = self.attr('name');
    select_options = $(this).children();
    // an array so that we can related options together
    sorted_options = [];
    //loop through the options sorting them into the array as we go.
    for(i=0;select_options.length>i;i++) {
        sorted_options.push({
            'value': select_options.eq(i).val(),
            'name': select_options.eq(i).text()
        });
    }

Итак, я получаю параметры и затем сортирую их в массив, когда я помещаю этот массив в консоль, я получаю следующее:

[Object { value="0", name="I'm looking for..."}, Object { value="1", name="actors"}, Object { value="2", name="presenters"}, Object { value="3", name="voice overs"}]
[Object { value="0", name="Skill"}, Object { value="1", name="actors"}, Object { value="2", name="presenters"}, Object { value="3", name="voice overs"}, Object { value="4", name="dancers"}, Object { value="5", name="accents"}, Object { value="6", name="film"}, Object { value="7", name="tv"}]
[Object { value="0", name="Gender"}, Object { value="1", name="male"}, Object { value="2", name="female"}]

Мой первый вопрос: как я могу удалить из массива все, что имеет значение 0, так как мой плагин заменяет первую запись из выпадающего списка, если пользователи тоже сообщают об этом, прежде чем я внес некоторые изменения в то, как я получил параметры, Я использовал следующее,

options.splice(0, 1);

Но параметров больше не существует, поэтому я не могу просто удалить первую запись каждого массива, во-вторых, мне нужно добавить значения и имена в мои новые выпадающие списки, однако у меня возникают проблемы с этим,

Я использую этот код для добавления значений в данный момент,

for(i=0;sorted_options.length>i;i++) {
    $('.dropdown dd ul').append('<li <a href="#"><span class="option">'+ sorted_options[i]['value'] + '</span><span class="value">' + sorted_options[i]['name'] + '</span></a></li>');
}

однако это добавляет все 3 объекта, которые я вижу в консоли, к первому раскрывающемуся списку, 2 объекта, которые я вижу в консоли, ко второму объекту и 1 объект к окончательному раскрывающемуся списку.

Мне нужно добавить первый объект в первый раскрывающийся список, второй - во второй, третий - в третий и т. Д.

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Для первого вопроса вы можете использовать функцию jQuery.grep() для фильтрации элементов массива.

var filteredArray = $.grep(rawArray, function(v,i) {
    return (v.value === '0' ? null : v);
});

Что касается вашего второго вопроса, я бы, вероятно, сделал это в духе (если я вас правильно понимаю), используя jQuery.each:

var template = $(
    '<li><a href="#"><span class="option"></span><span class="value"></span></a></li>'
), dropdown = $('.dropdown dd ul');

// notice that the args of $.grep and $.each are reversed
$.each(filteredArray, function(i,v) {
    // add the (i)th object to the (i)th dropdown
    dropdown.eq(i).append(
        template.clone()
            .find('.option').text(v.value).end()
            .find('.value).text(v.name).end()
    );
});

Так в основном:

  1. jQuery имеет встроенную функциональность для фильтрации и перебора необработанных JS-массивов.
  2. Кэшируйте HTML-шаблон, который вы вставляете в DOM (чтобы jQuery не проходил весь «выборочный» шебанг каждый раз, когда вы добавляете его в документ)
  3. Также кэшируйте выпадающий выбор по тем же причинам.
0 голосов
/ 04 октября 2011

Вы можете отфильтровать из списка все объекты, имеющие свойство value , равное 0 , следующим образом:

/**
 * Remove from a list all object having `obj.value` == value (ex. 0).
 *
 * @param {Object} value The value to avoid.
 * @param {Array:Object} A list of objects.
 * @return {Array:Object} The new filtered Array.-*emphasized text*
 */
function filterByValue(value, list) {
   var newlist = [],
       obj,
       max,
       i;

   for (i = 0, max = list.length; i < max; i += 1) {
      obj = list[i];

      if (obj.value !== value) {
         newlist.push(obj);
      }
   }
}

var newList = filterByValue(0, list);

Теперь вычтобы отфильтровать ваш список select_options (который представляет собой список списков):

function filter_selectOptions(select_options) {
   var sortedOptions;
       max,
       i;

   for (var i = 0, max = select_options.length; i < max; i += 1) {
      sortedOptions = select_options[i];
      sortedOptions = filterByValue(0, sortedOptions);             
   }
}

Затем вам нужно добавить правильный список options к соответствующему select.

* 1016.*
...