У меня есть тег множественного выбора. Я хотел бы извлечь выбранные значения в массив, однако, похоже, я могу извлечь только первое значение.
Пожалуйста, найдите упрощенную версию того, чего я пытаюсь достичь ниже.
Я пробовал несколько разных вариантов, используя:
this.valuenode().valueно это, кажется, извлекает только первое выбранное значение.
<!DOCTYPE html>
<html lang = "en">
<head>
<link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<script src = "https://d3js.org/d3.v5.min.js"></script>
</head>
<body>
<!-- Build the select boxes -->
<p>Single select tag</p>
<select class = "form-control" id = "select_single" >
<option value = "a">a</option>
<option value = "b">b</option>
<option value = "c">c</option>
<option value = "d">d</option>
</select>
<p id = "select_single_p"> </p>
<br>
<br>
<p>Multiple select tag</p>
<select multiple class = "form-control" id = "select_multiple" >
<option value = "a">a</option>
<option value = "b">b</option>
<option value = "c">c</option>
<option value = "d">d</option>
</select>
</body>
<script>
// This works for a single select
d3.select("#select_single")
.on("change",function(d){
console.info("this is the select single value " + this.value)
})
// But for multiple selects I can only extract the first value
d3.select("#select_multiple")
.on("change",function(d){this.value.len;
console.info("this is the select multiple value " + this.value )
console.info(d3.select('#select_multiple').node().value)
})
</script>
</html>


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


Вы можете использовать несколько подходов, для начала вы можете использовать прямой javascript в функции изменения:
d3.select("#select_multiple")
.on("change",function(d){
var values = Array.from(this.options) // create an array from the htmlCollection
.filter(function(option) { return option.selected }) // filter for selected values
.map(function(option) { return option.value; }); // return a new array with the selected values
console.info(values);
})
Другой вариант — использовать d3 для выбора выбранных параметров и для каждого из них получить значение:
d3.select("#select_multiple")
.on("change",function(d){
var values = [];
selected = d3.select(this) // select the select
.selectAll("option:checked") // select the selected values
.each(function() { values.push(this.value) }); // for each of those, get its value
console.info(values)
})
Оба варианта работают хорошо. Спасибо. Второе предложение кажется наиболее в духе d3.