删除数组元素是一个问题

时间:2011-09-28 07:23:43

标签: javascript

我有一种情况,我在点击按钮时添加表格,每个表格都存储在数组中。现在当我删除2或3个表时,正在删除错误的索引。

addTable: function (obj) {
    for (var i = 0; i < obj.length; i++) {

        // Adding of table
        array.push(obj)
        // delete code of the table 
        (function (i) {
            deleteButton.addEventListener('click', function (e) {
                array.splice(i, 1);

            });
        })(i);

    }
}

我面临的问题是i的值总是zero。每次我点击按钮时,都会调用addTable函数,计数器始终为zero,并且也会传递给function(i)

关于如何跟踪不同的i或计数器的任何想法,以便它删除数组中的正确索引

以下是更新

这是我每次发送的示例对象。

每次我点击Add Table按钮时,都会传递相同的对象。现在我很难跟踪每个项目的索引。

3 个答案:

答案 0 :(得分:1)

如果obj.length未定义,i将始终为0

更多,然后i < obj.length返回falsefor循环将永远不会执行

如果obj传入此对象:

var addObjectResponse = [{...}];

然后addObjectResponse是1的数组,因此i总是0

i = 0
obj.length = 1

i < obj.length =&gt; 0 < 1 =&gt;真一次

答案 1 :(得分:1)

一旦删除了一个表,所有其他表都已移动,并且您在删除按钮中安装的索引现在将出错。从阵列中删除项目时,所有索引都会移动。

所以,假设你删除了表3.然后,你按表4的删除。它的索引是4,但是因为你已经删除了表3,所以它现在在数组中的第3位(在上一次删除之后),但是,你的代码仍然有i == 4与该表相关联,并试图在这里删除它,但它不再存在了。

你在做什么并不是一个很好的方法。如果您想进一步扩展您真正想要做的事情,我们可以提供更好的解决方案。

鉴于我们到目前为止信息有限,我所知道的就是找到数组中的项目(无论它移到哪里)并从那里删除它。

addTable: function (obj) {
    for (var i = 0; i < obj.length; i++) {

        // Adding of table
        array.push(obj)
        // delete code of the table 
        (function (item) {
            deleteButton.addEventListener('click', function (e) {
                // search through the array to find where this item is 
                // and remove it from the array
                for (var j = 0; j < array.length; j++) {
                    if (array[j] === item) {
                        array.splice(j, 1);   // remove it
                        break;
                    }
                }

            });
        })(obj);
    }
}

答案 2 :(得分:1)

我不知道deleteButton,但如果obj是只有一个元素(length等于1)的数组:[{....}]array.push是原生的Array.prototype.push方法:

addTable: function (obj) {
  // Adding of table
  var index=array.push(obj);
  // delete code of the table 
  deleteButton.addEventListener('click', function (e) { array.splice(index, 1); });
}