javascript从数组中删除项目

时间:2014-03-24 10:22:47

标签: javascript arrays function object

我有一个js对象

var myClass = Class.extend({
    _innerArr: [],
    add: function( id, url ){
        this._innerArr.push([id, url]);
    },
    delete: function( id ){
        $( this._innerArr ).each(function( index ){
            if ( $( this )[0]==id ){
                 this._innerArr.splice( index, 1); // Doesn't work!!! Uncaught TypeError: Cannot call method 'splice' of undefined 
            }
        });
    }
});

但是,如果代码改变了:

 var globalArr;

 var myClass = Class.extend({
    _innerArr: [],
    add: function( id, url ){
        this._innerArr.push([id, url]);
    },
    delete: function( id ){
        globalArr = this._innerArr;
        $( this._innerArr ).each(function( index ){
            if ( $( this )[0]==id ){
                 globalArr.splice( index, 1); // Work!!! 
            }
        });

    }
});

为什么this._innerArr不起作用?我不想在我的项目中使用添加变量。想想,其他方式是......

2 个答案:

答案 0 :(得分:3)

使用jQuery的.each()方法时,函数将以this作为数组的当前值进行调用。您在执行$( this )[0]时正在使用它。 ($( this )[0]可能是不必要的。)

您不需要为此创建全局变量,但您也可以在delete函数中设置范围变量。

或者,您可以使用for循环而不是jQuery的each()。那也快一点。

答案 1 :(得分:0)

发生这种情况的原因是因为this回调内部.each()的范围发生了变化;这是众所周知的现象,通常涉及将this保存在函数调用之外的另一个变量中。

您可以使用jQuery.grep()

,而不是自己拼接
this._innerArr = $.grep(this._innerArr, function(element) {
    return element[0] != id;
});