#javascript
Вопрос:
<select id='listOfOptions' >
<option sid='15' value='test'>test</option>
<option sid='15' value='test2'>test2</option>
<option sid='16' value='plah'>plah</option>
<option sid='16' value='plah2'>plah2</option>
</select>
Мне нужно получить все данные из select> опция>>
в var в следующей форме
object = {
'15':('test','test2'),
'16':('plah','plah2')
}
Комментарии:
1. Этот формат недопустим. Я предполагаю, что вы хотите, чтобы [], а не () окружали значения.
Ответ №1:
Вы можете воспользоваться Array.reduce
.
Логические
- Выберите параметры
select
тега, выбрав выбрать из DOM. Я использовалdocument.getElementById
. Вы можете использоватьdocument.querySelector
или любой другой механизм выбора. - Это повторится
HTMLOptionsCollection
. Вы можете преобразовать это в массив, используяArray.from
- Используйте
Array.reduce
, чтобы сгруппировать это на основеsid
- Я также использовал деструкцию объектов для доступа к атрибуту sid answell в качестве значения параметра.
// Select the list options in the select
const options = document.getElementById('listOfOptions').options;
// Execute Array.reduce
const group = Array.from(options).reduce((acc, curr) => {
// Destructuring the curr object to access the option value and sid value
const { value, attributes: { sid: { value: sidValue } } } = curr;
acc[sidValue] ? acc[sidValue].push(value) : acc[sidValue] = [value];
return acc;
}, {});
console.log(group)
<select id='listOfOptions' >
<option sid='15' value='test'>test</option>
<option sid='15' value='test2'>test2</option>
<option sid='16' value='plah'>plah</option>
<option sid='16' value='plah2'>plah2</option>
</select>
Комментарии:
1. Подача готовых ответов с небольшим количеством объяснений менее полезна, чем более подробно объясненный ответ, особенно для новых участников, и особенно для таких простых вопросов по софтболу.
2. Я делаю такого рода комментарии ко всем ответам, как в оригинальной редакции. То есть ответы с кодом и небольшим объяснением. Во всяком случае, я с большей вероятностью прокомментирую, чем выше репутация, потому что люди с более высокой репутацией должны лучше знать, что чем больше объяснений, тем лучше.
3. Но я никогда не видел таких вещей для пользователей с более высокой репутацией. если вы делаете это действительно хорошо. Так держать.
Ответ №2:
Я бы использовал атрибут данных для sid
, а затем повторил бы параметры и создал новый объект forEach
.
const options = document.querySelectorAll('#listOfOptions option');
const obj = {};
options.forEach(el => {
// Grab the sid and value from the option element
const { dataset: { sid }, value } = el;
// If `sid` is not a key on the object
// create it, and set the value to an empty array
if (!obj[sid]) obj[sid] = [];
// Push the value to the array
obj[sid].push(value);
});
console.log(obj);
<select id="listOfOptions">
<option data-sid="15" value="test">test</option>
<option data-sid="15" value="test2">test2</option>
<option data-sid="16" value="plah">plah</option>
<option data-sid="16" value="plah2">plah2</option>
</select>
Дополнительная документация