JavaScript项目从Array中消失

时间:2014-04-11 21:39:46

标签: javascript arrays

我有一个名为objs的数组,它包含我的所有应用程序对象。根据应用程序中发生的情况,可以从此列表中添加和删除对象。

我遇到这个问题,有些物体有时会消失(或被覆盖)。如果我单步执行添加和删除功能,应用程序总是按原样运行,但是多次在没有调试器的情况下运行时,添加到列表末尾的一个或两个对象将从列表中消失。

将对象添加到数组中:

this.objs[this.objs.length]=obj;

并从数组中删除:

for(var i=0;i<this.objs.length;i++)
     if(this.objs[i]==obj)
           return this.objs.splice(i,1);

我将此代码放在添加和删除功能的末尾:

console.log("add! ");
console.log(this.objs);

Linked是在对象消失的会话期间控制台日志的图像:http://ilujin.com/error.png

顶部显示的列表中的前4个对象应在整个会话期间保留在列表中,但索引3处的对象(以红色突出显示)将被添加的下一个对象(以蓝色突出显示)覆盖。

另一个奇怪的是,显示的第二个列表已经包含所有更改(删除了4个对象,添加了1个),即使remove函数只被调用一次而add函数根本没有。

这使我得出结论,问题是时间 - 如果在调用下一个add之前没有完成添加,则第一个将被覆盖。并且所有控制台打印都是相同的,因为它们都发生在控制台可以读取和打印之前。

这有意义吗?出于某种原因,我认为JS从不运行并行代码,只在最后一个函数完成后转移到新函数。当我添加到列表中时,我使用objs列表的长度作为新索引的问题是什么?

如何解决此问题?我无法弄明白,调试器和控制台已被证明无用。

以下是应用:http://iioengine.com/neuro/study2.htm

您只需输入一个ID,然后查看是否弹出说明。如果他们这样做,比它的工作和刷新。如果他们不这样做,那意味着文本对象被覆盖了。

1 个答案:

答案 0 :(得分:1)

使用Javascript的数组方法可以提供更好的服务。

添加到数组:

this.objs.push(obj);

从数组中删除:

this.objs.splice(this.objs.indexOf(obj), 1);

另请注意,splice编辑原始数组并返回已删除的元素。从您的有限代码示例中很难说,但这也可能导致问题。