2012-02-05 14 views
0

我寫了jquery自定義fn擴展腳本來刪除數組中的給定元素,但它的工作方式意外的方式,所以我想弄清楚如何使其不使用返回參考方式進行參考操作。使用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"] //??? 

我期望[ 「一」, 「B」, 「d」, 「e」 的]在第四行。

p.s.我不想'回報'

+0

上面的例子進行了修改,以更精確地證明這個問題。 – jnhwkim 2012-02-05 13:57:31

回答

0

原因之一,這行代碼:

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'); 

由於jQuery對象,在全球方法,你可以做這樣的:

$.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對象,你可以這樣做:

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'); 

原型方法的工作示例在這裏:http://jsfiddle.net/jfriend00/tEXWH/

+0

如何包裝一個正常的數組?你能解釋一點細節嗎? – jnhwkim 2012-02-05 13:50:31

+0

@zannavi - 在我的答案中添加了多個示例。 – jfriend00 2012-02-05 16:14:02

+0

原型解決方案在我的情況下導致錯誤,NOT_FOUND_ERR:DOM異常8:嘗試在不存在的上下文中引用節點。 (mac osx safari 5.1.3當前版本)我對此沒有任何線索。 :( – jnhwkim 2012-02-05 22:17:21

0

因爲你的if (typeof(e) == "object")。一個數字(例如,3)不是"object"。這是一個"number"

我應該提到,雖然:在使用$(foo)時要小心foo是一個數組。 jQuery偶爾會做出令人驚訝的事情(取決於數組中的值)。最好是使用$.removeElement(myArray, toRemove)

+0

你是對的。但如果一個元素而不是3和一個元素列表可能會導致相同。正如你所說,我認爲使用$(數組)是一種壞主意。謝謝。 – jnhwkim 2012-02-05 13:44:07

0

jQuery already has a remove method爲了自己的目的。

如果你想爲本地JavaScript Array對象刪除具體方法,你應該只寫功能的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' ] 
+0

是不可能使用jQuery的上下文嗎? 此示例導致錯誤, NOT_FOUND_ERR:DOM異常8:嘗試在不存在的上下文中引用節點。 (mac osx safari 5.1.3當前版本) – jnhwkim 2012-02-05 22:14:37

+0

jQuery已經有一個'remove'方法。你需要的東西超出了這種方法已經做了什麼?我不知道爲什麼你會看到這個錯誤,因爲這個代碼在我的Safari 5中運行良好。 – Brandan 2012-02-05 23:33:32