Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组中删除所选元素_Javascript - Fatal编程技术网

Javascript 从数组中删除所选元素

Javascript 从数组中删除所选元素,javascript,Javascript,嗨,我尝试过使用“indexOf”,但似乎我删除了数组的最后一个元素,而不是所选的元素 我如何解决这个问题,所以是我选择的元素被删除,而不是最后或第一个元素 我试过使用“indexOf”我试过。。。。我知道如何删除和元素,但现在元素的位置,我不知道如何删除 function getTodoItems() { for (var i = 0; i < dataArray.length; i++) { if (!dataArray[i].listItem.length)

嗨,我尝试过使用“indexOf”,但似乎我删除了数组的最后一个元素,而不是所选的元素

我如何解决这个问题,所以是我选择的元素被删除,而不是最后或第一个元素

我试过使用“indexOf”我试过。。。。我知道如何删除和元素,但现在元素的位置,我不知道如何删除

function getTodoItems() {
    for (var i = 0; i < dataArray.length; i++) {
        if (!dataArray[i].listItem.length) return;
        var itemList = document.getElementById("my-todo-list");
        var list = document.createElement("li");
        itemList.appendChild(list);
        list.innerHTML = dataArray[i].listItem;
        var spanItem = document.createElement('span');
        spanItem.style.float = 'right';
        var myCloseSymbol = document.createTextNode('\u00D7');
        spanItem.classList.add("closeBtn");
        spanItem.appendChild(myCloseSymbol);
        listItems[i].appendChild(spanItem);
/////////////////////////////////////////////////////////////////////////////

        close[i].onclick = function() {
            var div = this.parentElement;
            div.style.display = "none";
            var position = dataArray.indexOf(dataArray[i]); // Fix denne her linje
            dataArray.splice(position, 1); // Fix denne her linje
            localStorage.setItem("itemListRecord", JSON.stringify(dataArray));
            console.log(dataArray);
        }
        var list = document.getElementsByTagName('li');
        list[i].onclick = function() {
            this.classList.toggle("checked");
        }

    }
}


下面是我的代码的外观

您可以使用
Array.filter
来过滤不需要的元素

const arr=[1,2,3,4,5];
const result=arr.filter((项)=>项%2==0);
控制台日志(结果)这就是问题所在:
var position=dataArray.indexOf(dataArray[i])

循环运行完成后,
i
将始终引用最后一项的索引。例如,此函数看起来可能会打印1、2、3、4、5。实际上,它会打印五次
5
。当
console.log
部分实际运行时,var
i
已经等于
5

for(var i=0;i<5;++i){setTimeout(function(){console.log(i);},2000)}

^尝试将其粘贴到控制台中

无论如何,要修复它,您需要在数组中找到该项的索引,其中
key:value
对匹配需要删除的todo项的文本

close[i].onclick = function(e) {
            var div = e.target.parentElement;
            var divText = div.childNodes[0].nodeValue; // use this!
            div.style.display = "none";
            var position = dataArray.findIndex(todo => todo.listItem === divText);
            dataArray.splice(position, 1);
            localStorage.setItem("itemListRecord", JSON.stringify(dataArray));
        }
工作小提琴:

旁注:这也应该改变。在一个不知名的窗口试一下你的小提琴,看看原因

// this is bad... a user may not have anything in their localStorage yet.
var dataArray = [];
dataArray = JSON.parse(localStorage.getItem("itemListRecord"));
// do this instead.
var dataArray = JSON.parse(localStorage.getItem("itemListRecord")) || new Array();

可能重复的也可能重复的不起作用。。。还是最后一个element@OliverHouston你能为我运行的代码提供一个解决方案吗?无论我使用filter indexOf做什么,无论它删除最后一项,你能将代码最小化到相关部分吗?这是你拥有的最新的小提琴吗?当我按下“添加”按钮时,控制台中出现错误,并且没有创建todo列表。我刚刚测试过,它工作正常,使用时小提琴中没有错误。我发现了错误,并修复了您询问的其他错误。看看我编辑过的答案,我确实使用了Array.findIndex()方法。