2012-01-12 10 views
5

Tengo una serie de cadenas en jQuery. Tengo otra matriz de palabras clave que quiero usar para filtrar la matriz de cadenas.¿Cómo tomo una serie de cadenas y las filtro?

Mis dos matrices:

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

Cómo puedo filtrar la matriz arr utilizando la matriz keywords en jQuery? En esta situación, se filtraría "Sally funciona en Taco Bell" y se quedará con el resto.

A continuación se muestra el código real que estoy usando.

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

Todo el propósito de esto es permitir que el usuario filtre los resultados del registro. Por lo tanto, el usuario realiza una acción que inicia startTail() y $.getJSON() recupera un objeto JSON creado por una función de PHP e imprime los resultados. Funciona perfectamente. Ahora quiero dar al usuario la opción de filtrar los elementos de seguimiento entrantes. El usuario hace clic en un botón de filtro y jQuery toma el texto del filtro y lo agrega a la matriz keywords, luego data.log del objeto JSON se filtra usando la matriz keywords y luego se agrega a la pantalla.

También tengo una función de filtro de eliminación que no está funcionando. Quizás alguien pueda ayudarme con eso.

+0

añadido la etiqueta Javascript, ya que esta es una cuestión Javascript (jQuery es una biblioteca de Javascript).Por cierto, esas matrices no parecen ser matrices de Javascript ... – kapa

+0

También eliminé la etiqueta jQuery ya que la pregunta no tiene nada que ver con eso. Además, @bazmegakapa tiene razón. Esas no son matrices de JavaScript válidas. Eso se parece a las matrices de PHP. En JavaScript, simplemente use los corchetes: 'var arr = [1, 2, 3]' –

+0

Tiene razón. Lo siento ... el programa que escribí utiliza una combinación de jQuery, Javascript, PHP y HTML. Simplemente se ha mezclado un poco. – amlane86

Respuesta

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

sin jQuery:

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

+1 por frescura. ¿Funciona? – qwertymk

+0

@qwertymk Bueno, solo he probado en IE7 y Chrome, no hay razón para que no funcione en otros navegadores. Si está utilizando el segundo en un navegador heredado, necesita ajustar '.filter' y' .bind' de MDN, por ejemplo. – Esailija

+0

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

0

Puede utilizar la función [filter][1], pero de cualquier forma deberá recorrer ambas matrices. Puede usar indexOf para verificar si una cadena está contenida dentro de otra cadena.

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

palabra de jQuery para "filtro" se 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 mejor respuesta aquí, en mi opinión, a pesar de que presta algo de la mía;). –

+0

@ChrisPratt: No pedí prestado nada. – 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]); 
    } 
} 

ACTUALIZACIÓN

Dado que hay mejores respuestas aquí desde una perspectiva jQuery, he modificado mi responder a un va Enfoque JavaScript de nilla, solo para aquellos que puedan necesitar hacer esto sin jQuery.

+0

... y realmente tengo que pensar en regex'es en la cima de la cabeza. bien hecho. : D sería bueno abrocharlo con la función '$ .grep()' sin embargo. +1 –

+0

+1 solución muy agradable, escriba el bucle, y no se necesita jQuery: D – jondavidjohn

+2

Puede que quiera incluir un 'hasOwnProperty()' si está usando 'for..in' sinceramente solo usaría un' para', se trata de arreglos, no de objetos. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty – jondavidjohn

0

usando jQuery increíbles poderes:

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

violín: http://jsfiddle.net/LQ92u/1/

1

superior de la cabeza, y no probado. Como un plugin de 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); 

A continuación, puede (supuestamente) de ejecución que le gusta:

var bar = $.foo(keywords, arr); 
Cuestiones relacionadas