#javascript #arrays #checkbox
Вопрос:
Я совершенно новичок в javascript. Любая помощь очень ценится.
Я создал упрощенный пример для более легкого объяснения. Я хочу изменить a finalArray
в зависимости от того, установлены или сняты флажки.
Так, например, если friends
strangers
установлены флажки и, то finalArray_
должно = ["friend1" ,"friend2", "stranger1", "stranger2"]
.
Если установлен только enemies
флажок, то finalArray_
должно = ["enemy1" ,"enemy2"]
. И так далее.
<body>
<input type="checkbox" data-id="friends_"> Friends <br />
<!-- other code and functionality -->
<input type="checkbox" data-id="enemies_"> Enemies <br />
<!-- other code and functionality -->
<input type="checkbox" data-id="strangers_"> Strangers <br />
<script>
const friends_ = ["friend1","friend2"];
const enemies_ = ["enemy1","enemy2"];
const strangers_ = ["stranger1","stranger2"];
</script>
</body>
Я пробовал это, но я знаю, что это дерьмовое решение, которое не работает, потому что я не могу связать такую строку.
<script>
const friends_ = ["friend1", "friend2"];
const enemies_ = ["enemy1", "enemy2"];
const strangers_ = ["stranger1", "stranger2"];
const checkboxes = document.querySelectorAll("input[type=checkbox]");
checkboxes.forEach(function (checkbox) {
checkbox.addEventListener('change', function () {
checked_boxes = Array.from(checkboxes).filter(i => i.checked).map(i => i.dataset.id).join();
const finalArray = [].concat(checked_boxes);
console.log(finalArray); //Array [ "friends_,strangers_" ]
})
})
</script>
Спасибо за ваши предложения.
Комментарии:
1. Итак, вы хотите, чтобы выбранные флажки были в массиве?
2. да и динамически обновляйте массив при каждом изменении флажков
Ответ №1:
Я объединил различные блоки в один объект, чтобы использовать идентификатор данных в качестве ключа для получения массива.
Я не запускал его с тех пор, как сделал это на своем телефоне, но вы можете попробовать, и это должно сработать.
ред:
Теперь я изменил его на своем компьютере. Должен запускаться и показывать вам вывод при нажатии на флажки.
ED2:
Я перенес всю логику в функцию, которая вызывается при загрузке страницы и при переключении флажка.
const units = {
friends_: ["friend1", "friend2"],
enemies_: ["enemy1", "enemy2"],
strangers_: ["stranger1", "stranger2"],
}
let selectedUnits = [];
const checkBoxes = document.querySelectorAll("input[type=checkbox]");
checkBoxes.forEach(elm => elm.addEventListener("change", updateUnits));
document.onload = updateUnits();
function updateUnits() {
selectedUnits = Array.from(checkBoxes)
.filter(elm => elm.checked)
.flatMap(elm => units[elm.getAttribute('data-id')]);
console.clear();
console.log(selectedUnits);
}
<body>
<input type="checkbox" data-id="friends_" checked> Friends <br />
<!-- other code and functionality -->
<input type="checkbox" data-id="enemies_"> Enemies <br />
<!-- other code and functionality -->
<input type="checkbox" data-id="strangers_"> Strangers <br />
</body>
Комментарии:
1. существует неперехваченная ошибка типа: флажки.фильтр-это не функция, я ее проверю.
2. Попробуй сейчас. Установите флажок в списке узлов, поэтому мне пришлось сначала преобразовать его в массив с помощью Array.from().
3. да, это отлично работает! я заметил , что если я установлю какой-то флажок по умолчанию (например
<input type="checkbox" checked data-id="friends_"> Friends <br />
, программа не работает должным образом, как раньше. Есть идеи, как это исправить?
Ответ №2:
Вы можете создать dict
набор данных с использованием и obj
key-value
пар checkbox
данных.
Когда флажок установлен, вы можете включить его id
, dict
а затем получить результаты, выполнив итерацию dict
const friends_ = ["friend1", "friend2"];
const enemies_ = ["enemy1", "enemy2"];
const strangers_ = ["stranger1", "stranger2"];
const dict = new Set();
const obj = { friends_, enemies_, strangers_ };
const checkboxes = document.querySelectorAll( "input[type=checkbox]" );
checkboxes.forEach( function ( checkbox ) {
checkbox.addEventListener( 'change', function (e) {
const id = e.target.dataset.id;
if(dict.has(id)) dict.delete(id);
else dict.add(id);
const result = [];
for(let key of dict) result.push(...obj[key])
console.log(result);
} )
} )
body {
display: flex;
}
<input type="checkbox" data-id="friends_" id="Friends" />
<label for="Friends">Friends</label>
<!-- other code and functionality -->
<input type="checkbox" data-id="enemies_" id="Enemies" />
<label for="Enemies">Enemies</label>
<!-- other code and functionality -->
<input type="checkbox" data-id="strangers_" id="Strangers" />
<label for="Strangers">Strangers</label>