javascript - 如何动态删除和添加值到数组
问题描述
我有三个按钮。我只需要通过单击按钮将相应的值添加到数组中,但如果该值已存在于我的数组中,我需要将其从我的数组中删除。我的代码只有在我们使用它两次(添加和删除)同一个按钮时才有效。但是如果我们用不同的方式使用它——它就坏了。试试下面的例子。这种行为的原因是什么?
只有纯 JavaScript。
let buttons = document.querySelectorAll('.string')
let array = []
let value = ''
buttons.forEach(el => el.addEventListener('click', () => {
value = el.innerHTML
for (i = 0; array.length + 1; i++) {
if (array[i] === value) {
delete array[i]
array = array.filter(x => x) // clear empty values
console.log('deleted', array)
} else {
array.push(value)
console.log('added', array)
}
break
}
}))
<div class="block">
<div class="string">some</div>
<div class="string">else</div>
<div class="string">other</div>
</div>
解决方案
它没有按预期工作,因为如果该值与数组中的第一个元素不匹配,则会将其推送并且循环中断。(无论如何,您的循环总是在第一个索引之后中断......)
相反,如果它存在于数组中,您可以只使用它Array.prototype.indexOf
来获取元素的索引,然后如果它存在则删除该索引,如果不存在则推送它。
您也可以使用Array.prototype.splice(index, deleteCount)
删除您不想要的索引,而不是执行delete
and Array.prototype.filter
。
let buttons = document.querySelectorAll('.string')
let array = []
let value = ''
buttons.forEach(el => el.addEventListener('click', () => {
value = el.innerHTML
let i = array.indexOf(value);
if(i > -1)
{
array.splice(i, 1);
console.log('deleted', array)
}
else
{
array.push(value)
console.log('added', array)
}
}))
<div class="block">
<div class="string">some</div>
<div class="string">else</div>
<div class="string">other</div>
</div>
如果您决定改用 for 循环,我还修复了您的原始代码段以使其使用您拥有的循环工作:
let buttons = document.querySelectorAll('.string')
let array = []
let value = ''
buttons.forEach(el => el.addEventListener('click', () => {
value = el.innerHTML
if(array.length < 1)
{
array.push(value)
console.log("added", array)
return
}
for (i = 0; i < array.length; i++) {
if (array[i] === value) {
array.splice(i, 1)
console.log('deleted', array)
break
} else if (i == array.length - 1) {
array.push(value)
console.log('added', array)
break
}
}
}))
<div class="block">
<div class="string">some</div>
<div class="string">else</div>
<div class="string">other</div>
</div>
推荐阅读
- c++ - MQTT 发布异常(访问冲突读取位置)
- javascript - Vuejs 向烧瓶服务器发送请求,更改 url 并返回原始 json
- python - 使用 gsheet batch_update 在 python 3.8 上是否存在问题?
- php - Windows 任务管理器中的任务超时的可能原因有哪些?
- c# - 在 blazor 中绑定动态值的最佳方法是什么
- c - 如何在范围检查之前重做代码以在循环顶部提示读取和输入
- marklogic - Marklogic Data Hub 框架 5.2.2 映射
- mysql - 错误代码:1292。日期值不正确:日期列的“0000-00-00”
- mysql - MySQL 配置文件单位差异
- python - 根据交替列从 pandas DataFrame 中删除行