Javascript selecbox.options для массива?
Из того, что я понимаю, элементы option
, которые popouate select
элементы в HTML являются массивом.
Поэтому в основном я хочу вернуть строку массива, разделенную запятыми.
Пытался сделать selecbox.options.join(',');
, но получил ошибку, которая не поддерживается; у кого есть идея, почему?
Ответы
Ответ 1
Это не массив. Это объект. Это "массив"
с http://api.jquery.com/jQuery.each/, который МОЖЕТ перебирать либо:
Перебирайте как объекты, так и массивы. Массивы и массоподобные объекты со свойством длины (например, объект аргументов функции) итерируются по числовому индексу от 0 до длины-1. Другие объекты повторяются через их именованные свойства.
Каждый элемент HTML Option имеет значение, текст и некоторые другие атрибуты.
Можно использовать простой цикл for
vals = []
var sel = document.querySelector("select");
for (var i=0, n=sel.options.length;i<n;i++) { // looping over the options
if (sel.options[i].value) vals.push(sel.options[i].value);
}
Array.apply, опубликованный typeracer, вернет массив HTMLOptionElements, которые все еще нужно зациклить или отобразить, чтобы получить значения и тексты.
Вот несколько версий, которые вернут то же самое.
Эта скрипка тоже будет работать в IE11
var vals, sel = document.querySelector("select"), show=function(vals) {$("#result").append("[" + vals.join("][") + "]<hr/>");}
var supportsES6 = function() {try{new Function("(a = 0) => a");return true;}catch (err) {return false; }}();
// jQuery mapping jQuery objects - note the "this" and the .get()
vals = $('select > option').map(function() {return this.value;}).get();
show(vals);
// plain JS using loop over select options
vals = [];
for (var i = 0, n = sel.options.length; i < n; i++) { // looping over the options
if (sel.options[i].value) vals.push(sel.options[i].value); // a bit of testing never hurts
}
show(vals);
// Plain JS using map of HTMLOptionElements - note the el
vals = Array.apply(null, sel.options).map(function(el) { return el.value; });
show(vals);
// ES6 JS using spread and map of HTMLOptionElements - note the fat arrow and el
if (supportsES6)
document.write('<script>
vals = [...sel.options].map(el => el.value);
show(vals);
<\/script>'
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<select>
<option value="Please select">Text 0</option>
<option value="one">Text 1</option>
<option value="two">Text 2</option>
<option value="three">Text 3</option>
</select><br/>
The above select has the following option values:<br/>
<span id="result"></span>
Ответ 2
Наиболее кратким решением является следующее:
Array.apply(null, selectbox.options)
Array.apply
вызывает конструктор Array
с первым аргументом как контекст (т.е. this
), а второй аргумент - любой объект, подобный массиву (Ссылка MDN).
Мы передаем null
для первого аргумента, потому что мы не пытаемся вызвать метод для определенного объекта, а скорее глобальный конструктор.
Итак, вообще говоря,
Array.apply(null, A)
Создает правильный массив, содержащий элементы любого "массивного" объекта A
.
Ответ 3
Чтобы получить все значения в массиве:
var options = document.getElementById('selectId').options;
var values = [];
var i = 0, len = options.length;
while (i < len)
{
values.push(options[i++].value);
}
alert(values.join(', '));
Скрипка: http://jsfiddle.net/garreh/64pyb/1/
вау долгий путь сделать что-то короткое
Ну, вы можете использовать цикл for, не намного короче, а более уродливо;
for (var options = document.getElementById('selectId').options,
values, i = 0, len = options.length; i < len;i++)
values.push(options[i].value);
alert(values.join(', '));
Опять же, это позор, что вы не используете библиотеку, такую как jQuery. Вы могли бы сделать:
$('select > option').map(function() { return this.value; }).get();
Ответ 4
selecbox.options
- это коллекция (nodeList). Вы можете перебирать этот элемент так же, как вы, с массивом, нажимать элементы коллекции на реальный массив.
Для записи: во всех браузерах, кроме IE < 9, вы можете использовать [].slice.call(selecbox.options);
1 чтобы быстро преобразовать коллекцию в массив.
Таким образом, способ конвертирования коллекции nodeList в массив должен быть:
function coll2array(coll){
var ret = [];
try {
ret = [].slice.call(coll)
}
catch(e) {
for (var i =0;i<coll.length;i++){
ret.push(coll[i]);
}
}
return ret;
}
[ изменить] В настоящее время (ES2015 и выше) мы можем использовать Array.from([arraylike object])
.
1 или Array.prototype.slice.call([some collection])
Ответ 5
select.options не является массивом, это NodeList, который разделяет некоторые функции массива и поэтому может быть описан как массив. NodeList не имеет методов, которые имеет Array, но вы можете call или apply эти методы.
В вашем случае вы можете вызвать метод соединения следующим образом:
var opts = yourSelect.options;
var str = Array.prototype.join.call( opts, ',' );
В качестве альтернативы вы можете преобразовать NodeList в истинный массив с аналогичной техникой
// slice returns a new array, which is what we want
var optsArray = Array.prototype.slice.call( opts );
Ответ 6
Вы можете присоединиться к массиву строк, но параметр не является строкой, это объект со всеми видами свойств, такими как значение и текст. Для чего он должен присоединиться?
Вам просто нужно написать цикл, чтобы добавить все нужные значения.
Или используйте библиотеку и используйте некоторую функцию each() для прокрутки опций.