2012-01-12 20 views
5

Ho una matrice di stringhe in jQuery. Ho un'altra serie di parole chiave che voglio usare per filtrare l'array di stringhe.Come posso prendere una serie di stringhe e filtrarle?

miei due array:

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

Come posso filtrare la matrice arr utilizzando la matrice keywords in jQuery? In questa situazione filtrerebbe "Sally lavora a Taco Bell" e tiene il resto.

Di seguito è riportato il codice effettivo che sto utilizzando.

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

Lo scopo di questo è di permettere all'utente di filtrare i risultati di registro. Quindi l'utente esegue un'azione che inizia con startTail() e $.getJSON() recupera un oggetto JSON creato da una funzione PHP e stampa i risultati. Funziona perfettamente. Ora voglio dare all'utente la possibilità di filtrare gli elementi di coda in entrata. L'utente fa clic su un pulsante filtro e jQuery prende il testo del filtro e lo aggiunge all'array keywords, quindi lo data.log dall'oggetto JSON viene filtrato utilizzando l'array keywords e quindi aggiunto allo schermo.

Ho anche una funzione di filtro di eliminazione che non funziona. Forse qualcuno può aiutarmi con quello.

+0

Aggiunto il tag Javascript, perché questa è una domanda Javascript (jQuery è una libreria per JavaScript).A proposito, quegli array non sembrano essere array di Javascript ... – kapa

+0

Ho rimosso anche il tag jQuery poiché la domanda non ha nulla a che fare con esso. Inoltre, @bazmegakapa ha ragione. Quelle non sono matrici JavaScript valide. Sembra un array PHP. In JavaScript, usa semplicemente le parentesi quadre: 'var arr = [1, 2, 3]' –

+0

Hai ragione. Scusate ... il programma che ho scritto usa una combinazione di jQuery, Javascript, PHP e HTML .. è stato un po 'confuso. – amlane86

risposta

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

senza jQuery:

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

+1 per la freschezza. Funziona? – qwertymk

+0

@qwertymk ho provato solo in IE7 e Chrome, non c'è ragione per non funzionare in altri browser. Se si sta utilizzando il secondo in un browser legacy, è necessario shim '.filter' e' .bind' da MDN per esempio. – Esailija

+0

[DEMO] (http://jsfiddle.net/yDbGq/) – qwertymk

0

È possibile utilizzare la funzione [filter][1], ma in entrambi i casi è necessario eseguire il ciclo di entrambi gli array. È possibile utilizzare indexOf per verificare se una stringa è contenuta all'interno di un'altra stringa.

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

parola di jQuery per "filtro" è 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

La migliore risposta qui a mio avviso, anche se in qualche modo prende in prestito dal mio;). –

+0

@ChrisPratt: non ho preso in prestito nulla. – georg

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

Dal momento che c'è risposte migliori qui da una prospettiva di jQuery, ho modificato il mio rispondi a un va approccio di nilla JavaScript, solo per coloro che potrebbero aver bisogno di farlo senza jQuery.

+0

... e devo seriamente pensare a regex'es top of head. ben fatto. : D sarebbe bello schiaffeggiarlo con la funzione '$ .grep()'. +1 –

+0

+1 soluzione molto bella, scrivere il ciclo, e nessuna jQuery necessaria: D – jondavidjohn

+2

Potrebbe voler includere un 'hasOwnProperty()' se stai usando 'for..in', onestamente, userò un normale' per ', hai a che fare con matrici non oggetti. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty – jondavidjohn

0

utilizzando jQuery straordinari poteri:

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

violino: http://jsfiddle.net/LQ92u/1/

1

superiore della testa, e non testato. Essendo un plugin 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); 

Poi si può (presumibilmente) percorso che piace:

var bar = $.foo(keywords, arr); 
Problemi correlati