2012-01-12 110 views
5

我在jQuery中有一個字符串數組。我有另一個我想用來過濾字符串數組的關鍵字數組。如何獲取一串字符串並對其進行過濾?

我的兩個數組:

var arr = new Array("Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"); 

    var keywords = new Array("Tom", "Ohio"); 

我如何使用jQuery中的keywords陣列篩選arr陣列?在這種情況下,它會過濾出「薩莉在塔科貝爾工作」並保留其餘部分。

以下是我正在使用的實際代碼。

var keywords= []; 
var interval = ""; 
var pointer = ''; 
var scroll = document.getElementById("tail_print"); 

$("#filter_button").click(
function(){ 
    var id = $("#filter_box").val(); 
    if(id == "--Text--" || id == ""){ 
     alert("Please enter text before searching."); 
    }else{ 
     keywords.push(id); 
     $("#keywords-row").append("<td><img src=\"images/delete.png\" class=\"delete_filter\" /> " + id + "</td>"); 
    } 
} 
); 

$(".delete_filter").click(
function(){ 
    ($(this)).remove(); 
} 
); 

function startTail(){ 
clearInterval(interval); 
interval = setInterval(
function(){ 
    $.getJSON("ajax.php?function=tail&pointer=" + pointer + "&nocache=" + new Date(), 
     function(data){ 
      pointer = data.pointer; 
      $("#tail_print").append(data.log); 
      scroll.scrollTop = scroll.scrollHeight; 
     }); 
}, 1000); 
} 

這樣做的全部目的是讓用戶過濾日誌結果。因此,用戶執行一個操作,該操作開始startTail()$.getJSON()檢索由PHP函數構建的JSON對象並打印結果。作品完美無瑕。現在我想讓用戶選擇過濾進入的拖尾項目。用戶單擊過濾器按鈕,jQuery將過濾器文本添加到keywords數組中,然後使用keywords數組篩選來自JSON對象的data.log,然後將其附加到屏幕上。

我也有一個不起作用的刪除過濾器功能。也許有人可以幫助我。

+0

新增的Javascript代碼,因爲這是一個JavaScript的問題(jQuery是爲Javascript庫)。順便說一句,這些數組似乎不是Javascript數組... – kapa 2012-01-12 17:55:29

+0

我也刪除了jQuery標籤,因爲問題與它無關。另外,@ bazmegakapa是對的。這些不是有效的JavaScript數組。這看起來像PHP數組。在JavaScript中,只需使用方括號:var arr = [1,2,3]' – 2012-01-12 18:01:01

+0

您是對的。對不起,我寫的程序使用了jQuery,Javascript,PHP和HTML的組合..剛剛有點混淆。 – amlane86 2012-01-12 18:02:15

回答

8
$.grep(arr, $.proxy(/./.test, new RegExp(keywords.join("|")))); 

沒有jQuery的:

arr.filter(/./.test.bind(new RegExp(keywords.join("|")))); 
+2

冷靜+1。它工作嗎? – qwertymk 2012-01-12 18:31:46

+0

@qwertymk我只在IE7和Chrome中測試過,沒有理由在其他瀏覽器中無法使用。如果您在傳統瀏覽器中使用第二個瀏覽器,則需要從MDN中填充「.filter」和「.bind」。 – Esailija 2012-01-12 18:32:34

+0

[DEMO](http://jsfiddle.net/yDbGq/) – qwertymk 2012-01-12 18:34:32

0

您可以使用[filter][1]函數,但無論使用哪種方式,都需要循環訪問這兩個數組。您可以使用indexOf來檢查字符串是否包含在另一個字符串中。

var arr = ["Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"]; 
var keywords = ["Tom", "Ohio"]; 
var filtered = []; 

for(var i = 0; i < arr.length; i++) { 
    for(var j = 0; j < keywords.length; j++) { 
     if (arr[i].indexOf(keywords[j]) > -1) { 
      filtered.push(arr[i]); 
      break; 
     } 
    } 
} 

console.log(filtered); 

Live example

4

jQuery的的 「過濾器」 字grep

var arr = ["Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"]; 
var keywords = ["Tom", "Ohio"]; 

var regex = new RegExp(keywords.join("|")); 

result = $.grep(arr, function(s) { return s.match(regex) }) 
+0

在我看來這裏最好的答案,即使它從我的一些借用;)。 – 2012-01-12 18:06:26

+0

@ChrisPratt:我沒有借任何東西。 – georg 2012-01-12 21:23:21

1
var filtered = []; 
var re = new RegExp(keywords.join('|')); 

for (var i=0; i<arr.length; i++) { 
    if (re.search(arr[i])) { 
     filtered.append(arr[i]); 
    } 
} 

UPDATE

由於從jQuery的角度來看這裏的更好的答案,我修改了回答一個VA nilla JavaScript方法,僅適用於那些可能需要在沒有jQuery的情況下執行此操作的人。

+0

......我認真地想到了正則表達式的頭頂。做得很好。 :D雖然使用'$ .grep()'函數拍攝它會很好。 +1 – 2012-01-12 18:03:47

+0

+1非常好的解決方案,寫出循環,並且不需要jQuery:D – jondavidjohn 2012-01-12 18:05:06

+2

如果您使用'for..in',可能希望包含'hasOwnProperty()'我老實說只是使用常規的'爲',你正在處理數組而不是對象。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty – jondavidjohn 2012-01-12 18:20:42

0

使用jQuery真棒權力:

var keywords = ["Tom", "Ohio"]; 
$(["Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"]).filter(function(k, v) { 
    return v.match("(" + keywords.join("|") + ")"); 
}); 
0
var keywords = ['Tom', 'Ohio']; 
var arr = ['Sally works at Taco Bell', 'Tom drives a red car', 'Tom is from Ohio', 'Alex is from Ohio']; 
var matcher = new RegExp(keywords.join('|')); 
var newarr = []; 
$.each(arr, function(index, elem) { 
    if (elem.match(matcher)) { 
     newarr.push(elem); 
    } 
}); 
console.log(newarr); 

小提琴:http://jsfiddle.net/LQ92u/1/

1

頂部頭,和未經考驗的。作爲一個jQuery插件:

(function($) { 

    $.foo = function(needle, haystack) { 
     return $.grep(haystack, function() { 
      var words = this.split(' '), 
       flag = false 
       ; 

      for(var i=0; i < words.length; i++) { 
       flag = $.inArray(words[i], needle); 
       if (flag) { break; } 
      } 

      return flag;     
     }); 
    }; 

})(jQuery); 

然後你可以(假定)運行,像:

var bar = $.foo(keywords, arr); 
相關問題