Javascript 使用jquery fn扩展名删除数组中的给定元素';我不以参考的方式工作

Javascript 使用jquery fn扩展名删除数组中的给定元素';我不以参考的方式工作,javascript,jquery,arrays,customization,Javascript,Jquery,Arrays,Customization,我编写了jquery自定义fn扩展脚本来删除数组中的给定元素, 但它以一种意想不到的方式工作,所以我想弄清楚如何让它在不使用返回引用方式的情况下进行引用操作 $.fn.removeElement=function(e){ var l=this.length; while(l--){ if(this[l]==e){ console.log(this); this.splice(l,1); con

我编写了jquery自定义fn扩展脚本来删除数组中的给定元素, 但它以一种意想不到的方式工作,所以我想弄清楚如何让它在不使用返回引用方式的情况下进行引用操作

$.fn.removeElement=function(e){
    var l=this.length;
    while(l--){
        if(this[l]==e){
            console.log(this);
            this.splice(l,1);
            console.log(this);
            break;
}   }   }
var x=['a','b','c','d','e'];
console.log(x);
$(x).removeElement('c');
console.log(x);
结果如下:

> ["a", "b", "c", "d", "e"]
> ["a", "b", "d", "e"]
> ["a", "b", "d", "e"]
> ["a", "b", "c", "d", "e"] //???
我希望[“a”、“b”、“d”、“e”]在第四行

p、 我不想“退货”…

因为你的
if(typeof(e)==“object”)
。数字(例如,
3
)不是
“对象”
。这是一个
“数字”


不过,我应该提到:当
foo
是数组时,使用
$(foo)
时要小心。jQuery偶尔会做一些令人惊讶的事情(取决于数组中的值)。最好使用
$.removeElement(myArray,toRemove)

一行代码:

if('object'==typeof(e))
在您的代码示例中如下所示:

if('object'==typeof(3))
那是

if('object'=='number')
这永远不会匹配

我还想问,为什么要在jQuery对象中封装普通数组。最好只使用对数组进行操作的方法

作为一个全局函数,您可以这样做:

function removeArrayElement(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
removeArrayElement(x, 'c');
$.removeArrayElement = function(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
$.removeArrayElement(x, 'c');
Array.prototype.removeElement = function(itemToRemove) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === itemToRemove) {
            this.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
x.removeElement('c');
函数removeArrayElement(数组,itemToRemove){
对于(var i=0;i
作为jQuery对象上的全局方法,您可以这样做:

function removeArrayElement(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
removeArrayElement(x, 'c');
$.removeArrayElement = function(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
$.removeArrayElement(x, 'c');
Array.prototype.removeElement = function(itemToRemove) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === itemToRemove) {
            this.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
x.removeElement('c');
$.removeArrayElement=函数(数组,itemToRemove){
对于(var i=0;i
作为数组对象上的一个方法,您可以这样做:

function removeArrayElement(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
removeArrayElement(x, 'c');
$.removeArrayElement = function(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
$.removeArrayElement(x, 'c');
Array.prototype.removeElement = function(itemToRemove) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === itemToRemove) {
            this.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
x.removeElement('c');
Array.prototype.removelement=函数(itemToRemove){
for(var i=0;i
此处原型方法的工作示例:

用于其自身目的

如果您想要一个专门针对本机JavaScript数组对象的remove方法,那么只需在jQuery上下文之外编写函数:

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

var x = ["a", "b", "c", "d"];
console.log(x);    // => [ 'a', 'b', 'c', 'd' ]
x.remove('b');
console.log(x);    // => [ 'a', 'c', 'd' ]
Array.prototype.remove=函数(el){
for(var i=0,j=this.length;i[‘a’、‘b’、‘c’、‘d’]
x、 删除(‘b’);
console.log(x);//=>[‘a’、‘c’、‘d’]

你说得对。但是如果一个元素而不是3和一个元素列表可能会导致相同的结果。正如您所说,我认为使用$(数组)是一种坏主意。谢谢。如何包装一个普通数组?您能解释得更详细一点吗?@zannavi-我的答案中添加了多个示例。原型解决方案在我的案例中导致错误,未找到错误:DOM异常8:尝试在不存在节点的上下文中引用该节点。(mac osx safari 5.1.3当前版本)我对此一无所知(@zannavi-您必须共享导致该错误的代码。我不知道您的代码是什么,可能会导致该错误。我提供的代码在这里工作正常:。我不喜欢函数(数组,项)方法,因为它没有利用该语言的引用概念。修改了上述示例以更精确地演示此问题。是否无法使用jQuery的上下文?此示例会导致错误,NOT_FOUND_ERR:DOM异常8:尝试引用上下文中不存在的节点。(mac osx safari 5.1.3当前版本)jQuery已经有了一个
remove
方法。除了该方法已有的功能之外,您还需要什么吗?我不知道您为什么会看到这个错误,因为该代码在我的safari 5中运行得很好。