2012-10-02 38 views
8

Dada una matriz de cadenas:¿Puedo usar comodines cuando busco una serie de cadenas en Javascript?

x = ["banana","apple","orange"] 

es que hay una construida en acceso directo para realizar búsquedas con caracteres comodín?

es decir., Tal vez

x.indexOf("*na*") //returns index of a string containing the substring na 
+2

¿Por qué no sólo la búsqueda de 'na' o utilizar una expresión regular ... Usted también podría aumentar String y escribir el suyo. – jahroy

+3

Usaría una expresión regular, posiblemente esto podría ayudar a http://stackoverflow.com/questions/6333246/regex-wildcard-for-array-search – Rahul

+0

Gracias, la sugerencia de expresiones regulares ayudó. Tal vez lo mencione como una respuesta "no hay atajos, pero usar una expresión regular es fácil", con un fragmento de muestra de código – blueberryfields

Respuesta

10

Ampliando la respuesta de Pim, la forma correcta de hacerlo (sin jQuery) sería esta:

Array.prototype.find = function(match) { 
    return this.filter(function(item){ 
     return typeof item == 'string' && item.indexOf(match) > -1; 
    }); 
} 

Pero, en realidad, a menos que estés utilizando esta funcionalidad en múltiples lugares, sólo puede utilizar el método existente filter:

var result = x.filter(function(item){ 
    return typeof item == 'string' && item.indexOf("na") > -1;    
}); 

versión de la expresión regular es similar, pero creo que va a crear un poco un poco más sobrecarga:

Array.prototype.findReg = function(match) { 
    var reg = new RegExp(match); 

    return this.filter(function(item){ 
     return typeof item == 'string' && item.match(reg); 
    }); 
} 

Sin embargo, proporciona la flexibilidad para permitirle especificar una cadena RegExp válida.

x.findReg('a'); // returns all three 
x.findReg("a$"); // returns only "banana" since it's looking for 'a' at the end of the string. 
+1

Gran respuesta. Pero esta solución no funcionará para cada cadena. Considere el caso de Urls donde podemos tener '?' y '/' en las cuerdas. El código arrojará un error para esos casos. – sachinjain024

0

se puede ampliar el prototipo de matriz para encontrar coincidencias en una matriz

Array.prototype.find = function(match) { 
    var matches = []; 
    $.each(this, function(index, str) { 
     if(str.indexOf(match) !== -1) { 
      matches.push(index); 
     } 
    }); 
    return matches; 
} 

A continuación, puede llamar a encontrar en su conjunto como tal

// returns [0,3] 
["banana","apple","orange", "testna"].find('na'); 
+0

-1 para jQuery cada – Shmiddty

3

Extendiéndose sobre @ respuesta de Shmiddty, aquí son ideas útiles de JavaScript:

  • Extender matriz con un nuevo método: Array.prototype.method = function(arg) { return result; }
  • matrices de filtro usando: Array.filter(function(e) { return true|false; })
  • aplicar la fórmula de los elementos de una array: Array.map(function(e) { return formula(e); })
  • Usar expresiones regulares: /.*na.*/ o new Regex('.*na.*')
  • utilizar expresiones regulares para que coincida con: var result = regex.test(input);
  • Uso Array.prototype.reduce a aggergate resultado después de ejecutar una función en cada elemento de una matriz

es decir, prefiero el argumento de entrada para ser una expresión regular, por lo que, se da que o bien:

  • Una corta pero universales patrón de entrada a juego,
    • por ejemplo,contiene, comienza con, termina anchura, así como partidos más sofisticados
  • La capacidad de especificar un patrón de entrada como una cadena

Solución 1: filtro, prueba, mapas y indexOf

Array.prototype.find = function(regex) { 
 
    var arr = this; 
 
    var matches = arr.filter(function(e) { return regex.test(e); }); 
 
    return matches.map(function(e) { return arr.indexOf(e); }); 
 
}; 
 
var x = [ "banana", "apple", "orange" ]; 
 
console.log(x.find(/na/)); // Contains 'na'? Outputs: [0] 
 
console.log(x.find(/a/)); // Contains 'a'? Outputs: [0,1,2] 
 
console.log(x.find(/^a/)); // Starts with 'a'? Outputs: [0] 
 
console.log(x.find(/e$/)); // Ends with 'e'? Outputs: [1,2] 
 
console.log(x.find(/pear/)); // Contains 'pear'? Outputs: []

SOLUCIÓN 2: reducir, prueba

Array.prototype.find = function(regex) { 
 
    return this.reduce(function (acc, curr, index, arr) { 
 
    if (regex.test(curr)) { acc.push(index); } 
 
    return acc; 
 
    }, [ ]); 
 
} 
 
var x = [ "banana", "apple", "orange" ]; 
 
console.log(x.find(/na/)); // Contains 'na'? Outputs: [0] 
 
console.log(x.find(/a/)); // Contains 'a'? Outputs: [0,1,2] 
 
console.log(x.find(/^a/)); // Starts with 'a'? Outputs: [0] 
 
console.log(x.find(/e$/)); // Ends with 'e'? Outputs: [1,2] 
 
console.log(x.find(/pear/)); // Contains 'pear'? Outputs: []

0

usando expresiones regulares puede hacer esto en javascript

var searchin = item.toLowerCase(); 
var str = columnId; 
str = str.replace(/[*]/g, ".*").toLowerCase().trim(); 
return new RegExp("^"+ str + "$").test(searchin); 
Cuestiones relacionadas