2010-04-06 60 views
2

我試圖使用jQuery $.inArray函數來遍歷數組,如果有一個元素的文本contains一個特定的關鍵字,刪除該元素。 $.inArray只是返回數組索引,儘管元素的文本是equal到關鍵字。jQuery Javascript數組'包含'功能?

例如給出以下數組命名爲「標記」:

- tokens {...} Object 
    [0] "Starbucks^25^http://somelink" String 
    [1] "McDonalds^34^" String 
    [2] "BurgerKing^31^https://www.somewhere.com" String 

並以removeElement(tokens, 'McDonalds');的調用將返回以下陣列:

- tokens {...} Object 
    [0] "Starbucks^25^http://somelink" String 
    [1] "BurgerKing^31^https://www.somewhere.com" String 

我猜這是可能的使用jQuery $.grep$.each函數,或者可能regex。然而,我不熟悉jQuery來完成這一點。

任何幫助,將不勝感激!

回答

4

grep的確實是要走的路的所有元素。

function removeElement(array, keyword) { 
    return $.grep(array, function (item, i) { 
     return item.indexOf(keyword) > -1; 
    }, true); 
} 

這將查找關鍵字作爲子字符串。如果數組的元素具有特定的格式(它們看起來像這樣,但沒有說明),請改變測試以匹配格式。

function removeElement(array, keyword) { 
    var keyRE=new RegExp('^'+keyword+'^'); 
    return $.grep(array, function (item, i) { 
     return keyRE.test(item); 
    }, true); 
} 

注意第一個'^'是一個元字符匹配的字符串的開始;第二個簡單地匹配'^'字符。

+0

我認爲他希望結果數組僅包含**不包含關鍵字**的內容。 – Pointy 2010-04-06 22:17:39

+0

波蒂有它的權利。儘管如果你創建的第一個removeElement函數返回的是數組索引而不是元素,那麼這也可以工作嗎? – YourMomzThaBomb 2010-04-06 22:34:24

+0

@YourMomzThaBomb:在第一個版本(實際上,兩者)中,數組索引被忽略。 'a.indexOf(b)'返回字符串'a'的字符串'b'的起始索引,如果'b'不是'a'的子字符串,則返回-1。 – outis 2010-04-06 22:46:35

0

編輯 oops我完全誤解了這個問題。

$.grep需要一個 「反轉」 標誌,這樣你就可以直接使用它:

var pattern = /\bword\b/; 
var newArray = $.grep(oldArray, function(e) { return pattern.test(e); }, true); 

當然,現在我想想,我可以節省5個字符:

var newArray = $.grep(oldArray, function(e) { return !pattern.test(e); }); 
0

這應該是明確的。從tokens參數中刪除所有包含search參數中傳入的字符串的元素。使用filter()

function removeElement(tokens, search) { 
    var regex = new RegExp(search); 
    return $(tokens).filter(function() { 
     return !regex.test(this); 
    }).toArray(); 
} 

如果你願意,你還可以指定爲標誌的正則表達式

例如

var regex = new RegExp(search, "i"); 

將刪除包含有情況下,搜索字符串忽略


$.grep版本的代碼

function removeElement(tokens, search) { 
    var regex = new RegExp(search); 
    return $.grep(tokens, function(elem, ind) { 
     return regex.test(elem); 
    }, true); 
} 
+0

爲每個迭代構建一個新的RegExp實例看起來很浪費。 – Pointy 2010-04-06 22:17:59

+0

已經修復... – jitter 2010-04-06 22:24:54