我的删除功能有什么问题?

时间:2011-02-02 19:25:25

标签: javascript

Array.prototype.remove = function (obj) {
    for(var i = 0; i < this.length; i++) {
        if(this[i] === obj) {
            if (i == this.length) {
                this[i] = null;
            } else {
                for(var j = i; j < this.length-1; j++) {
                    this[j] = this[j+1];
                }
                delete this[j]; // updated from this[j] = null; still not working.
            }
        }
    }
    return this;
};

用以下方式调用它:

write("ARRAY TEST = " + [22, 33, 44].remove(33).remove(22));

..它打印:

44,,

为什么这两个逗号以及如何修复我的删除功能以删除逗号?

5 个答案:

答案 0 :(得分:3)

delete上的

Array不会删除该元素,它会将其设置为undefined。由于打印时undefined会产生空字符串,因此会解释write()的结果。

您需要使用splice()删除该元素。如果你将它与indexOf结合使用(你可能需要为旧浏览器定义它),你会得到一个相当短的功能:

Array.prototype.remove = function (obj) {
    this.splice(this.indexOf(obj), 1);
    return this;
}
PS:我不是扩大原生原型的倡导者......

答案 1 :(得分:1)

将项目设置为null会在数组中留下一个项目(但它是一个空项目),这就是为什么你仍然看到逗号。

答案 2 :(得分:1)

如前所述,删除或将项设置为null仍会将项留在数组中。你想要使用的是Array.splice

这是一个应该有效的实现:

Array.prototype.remove = function (obj) {
    for(var i = 0; i < this.length; i++) {
       if(this[i] === obj)
       {
           this.splice(i,1);
           break;
       }       
    }
    return this;
};

答案 3 :(得分:0)

您不会从刚刚设置为null的数组中删除元素。 如果您需要灵感,请查看此删除方法。它是按索引而不是按元素。

http://ejohn.org/blog/javascript-array-remove/

尝试:

Array.prototype.remove = function (obj) {
    for(var i = 0; i < this.length; i++) {
        if(this[i] === obj) {
            if (i == this.length) {
                this.splice(i,1);
            } else {
                for(var j = i; j < this.length-1; j++) {
                    this[j] = this[j+1];
                }
                this.splice(j,1);
            }
        }
    }
    return this;
};

答案 4 :(得分:-1)

Array.prototype.remove = function (obj) {
    for(var i = 0; i < this.length; i++) {
        if(this[i] === obj) {
            if (i == this.length) {
                #this[i] = null;
                delete this[i];
            } else {
                for(var j = i; j < this.length-1; j++) {
                    this[j] = this[j+1];
                }
                #this[j] = null;
                delete this[i];
            }
        }
    }
    return this;
};

很确定这就是你想要的