Интересно, может ли кто-нибудь предложить лучший способ перебрать все <option> в элементе <select> с помощью jQuery и построить массив.
Например.
Вместо следующего, в котором строка ins передается в autoCompleteArray (),
$("#CityLocal").autocompleteArray(
[
"Aberdeen", "Ada", "Adamsville", "Zoar" //and a million other cities...
],
{
delay:10,
minChars:1,
matchSubset:1,
onItemSelect:selectItem,
onFindValue:findValue,
autoFill:true,
maxItemsToShow:10
}
);
... Мне нужно перебрать все <options> в <select>, вставить их в массив и просто передать эту переменную массива в функцию вместо длинной строки.
Например,
$("#CityLocal").autocompleteArray(
[
MyBigArrayOfOptions
],
{
delay:10,
minChars:1,
matchSubset:1,
onItemSelect:selectItem,
onFindValue:findValue,
autoFill:true,
maxItemsToShow:10
}
);
Буду признателен, если вы подскажете, как поместить данные в массив в правильном формате. Я почти понял, что такое зацикливание, из другого поста на этом сайте.
Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это должно работать:
$(document).ready(function(){
// array of option elements' values
var optionValues = [];
// array of option elements' text
var optionTexts = [];
// iterate through all option elements
$('#sel > option').each(function() {
// get value/text and push it into respective array
optionValues.push($(this).val());
optionTexts.push($(this).text());
});
// test with alert
alert(optionValues);
alert(optionTexts);
});
Учитывая, что ваш элемент select имеет идентификатор сел.
В цикле .each: if (this.selected) {// код для push}
Функция jQuery.map может быть тем, что вы ищете. Приведенный ниже код создаст массив, содержащий все значения или текстовые значения для опций <select>.
var values = jQuery.map(jQuery("#select")[0].options, function(option)
{
return option.value;
});
var texts = jQuery.map(jQuery("#select")[0].options, function(option)
{
return option.innerHTML;
});
Все, что вам нужно сделать, это передать массив в качестве первого параметра без скобок. Скобки создают новый массив, но вам не нужно этого делать, потому что вы уже передаете массив. Просто сделать:
$("#CityLocal").autocompleteArray(
MyBigArrayOfOptions,
{
delay:10,
minChars:1,
matchSubset:1,
onItemSelect:selectItem,
onFindValue:findValue,
autoFill:true,
maxItemsToShow:10
}
);
Если я правильно понимаю ваш вопрос, следующий код должен делать то, что вам нужно:
myFunction($("#my-select option"));
Результатом запроса уже является массив параметров, которые являются потомками select, поэтому вам не нужно помещать их в другой массив. В качестве альтернативы, если у вашего выбора нет идентификатора, но у вас есть элемент DOM:
myFunction($("option", theSelect));
Вставляем эту идею обратно в свой код:
$("#CityLocal").autocompleteArray(
$("option", theSelect),
{
delay:10,
minChars:1,
matchSubset:1,
onItemSelect:selectItem,
onFindValue:findValue,
autoFill:true,
maxItemsToShow:10
}
);
извините, я не понимаю, как будет работать этот конкретный пример. как $ ("# my-select option") создает массив в желаемом формате?
Как бы вы отфильтровали это только для выбранных элементов?