从JavaScript数组中删除任意元素

时间:2009-04-03 10:28:26

标签: javascript arrays splice

在我的Google地图应用程序中,我可以在地图上放置标记,并保留对放置的每个标记的引用,以及名为markers的数组中的一些额外信息。

添加标记很简单,我只是push()新创建的对象到数组(markers.push(marker));

但是,当从数组中删除任意标记时,给定插槽的索引,它不会按预期运行。我的职责是:

function deleteMarker(markerIndex) {
    if (markerIndex!='' && markerIndex>=0 && markerIndex<markers.length) {
        if (confirm('Do you really want to remove this marker from the map?')) {
            alert('deleting marker '+markerIndex); //debugging purposes
            markers.splice (markerIndex, 1);
        }
    }
}

我以前没有使用splice()函数的经验,但是看its description @ w3schools它似乎很简单。但是,我得到以下行为:

markers.splice()什么也没做。那么我做错了什么?

此外,当markerIndex为0时,不会显示确认框。起初我假设冗长的if条件被评估为false,因此整个代码块被跳过,但是,使用Firebug来逐步调用我发现当数组非空时条件为0的条件(当然) ,下一步显示if (confirm(...))alert('deleting...)跳过并且markers.splice()被调用(但没有任何反应)。这种行为很奇怪我决定打开这个问题。

任何人都可以澄清一下发生了什么吗?

我认为删除标记将是最容易实现的功能。我可以添加它们,编辑它们的内容,甚至清除所有标记pop() - 从markers数组中取出标记直到空白,并且一切正常。

3 个答案:

答案 0 :(得分:2)

代码的一个问题是JavaScript将0 == ''解释为true,因此对于markerIndex为零,您的确认代码不会被执行。我猜你错误解释了Firebug显示的步骤,或者它只是在这里有错误,因为你的if条件实际上会因为markerIndex为0而评估为false。

您可以通过添加额外的=来使用类型严格比较

if (markerIndex !== '' && ...) {

更简单的方法是:

if (markers[markerIndex] !== undefined) {

由于JavaScript在访问未定义的对象成员时不会引发错误。

splice()无法正常工作的其他问题很奇怪(应该可行)。

答案 1 :(得分:0)

function deleteMarker(markerIndex) {
    if (markers[markerIndex] !== undefined) {
        if (confirm('Do you really want to remove this marker from the map?')) {
            map.removeOverlay(markers[markerIndex]);
            markers.splice (markerIndex, 1);
        }
    }
}

这似乎可以解决所有问题。谢谢你的回答,非常感谢。 我特别喜欢将第一个if条件简化为:

的想法

if (markers[markerIndex] !== undefined)

splice()似乎直接在阵列上运行(与NuclearDog暗示的相反)并且它按预期工作。我最亲爱的Firebug误导了我。

答案 2 :(得分:-1)

不确定这是否是这里发生的事情。但我已经看到相同的代码在firebug中运行时在调试v时没有被调试。我很确定我没有任何干扰代码的手表。