У меня есть несколько флажков в html-форме. Мне нужно получить массив объектов, когда любой из флажков в html-форме установлен или снят, то есть при внесении изменений он должен возвращать массив объектов
Я предпочитаю использовать $.map
Ожидаемое значение
[{"A": "dataA"}, {"B": "dataB"}], когда проверяются и A, и B [{"A": "dataA"}], когда проверяется только A и т. д.
Я пробовал с
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$('input[type="checkbox"]').change(function() {
alert($.map($("input[type='checkbox']:checked"), function(i) {
var a = []
a[$(this).attr("name")] = $(this).attr("data-id");
return a
}));
});
});
</script>
<input data-id="dataA" name="A" type="checkbox" />A
<input data-id="dataB" name="B" type="checkbox" />B
</head>
</html>
2 ответа
Вы имеете в виду это?
Карта не соответствует тому, что вы хотите, и вы злоупотребляете массивом как объектом.
Вот массив объектов
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('input[type="checkbox"]').change(function() {
const res = []
$("input[type='checkbox']:checked").each(function(i) {
res.push({[$(this).attr("name")] : $(this).attr("data-id")});
});
console.log(res)
});
});
</script>
<input data-id="dataA" name="A" type="checkbox" />A
<input data-id="dataB" name="B" type="checkbox" />B
</head>
</html>
А вот и объект:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('input[type="checkbox"]').change(function() {
const res = {}
$("input[type='checkbox']:checked").each(function(i) {
res[$(this).attr("name")] = $(this).attr("data-id");
});
console.log(res)
});
});
</script>
<input data-id="dataA" name="A" type="checkbox" />A
<input data-id="dataB" name="B" type="checkbox" />B
</head>
</html>
Проблема с вашей логикой заключается в том, что map()
возвращает массив; вам не нужно определять новый массив в обработчике итерации и возвращать его. Вам просто нужно вернуть объект, который вы хотите сгенерировать, из каждого флажка, например:
jQuery($ => {
let $cb = $(':checkbox').on('change', () => {
let checkedValues = $cb.filter(':checked').map((i, el) => ({ [el.name]: el.dataset.id })).get();
console.log(checkedValues);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<input data-id="dataA" name="A" type="checkbox" />A
<input data-id="dataB" name="B" type="checkbox" />B
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.