Este dilema se puede abordar de variadas maneras, por lo tanto te mostramos la resolución más completa en nuestra opinión.
Solución:
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é usando esta función en varios lugares, puede usar la función existente filter
método:
var result = x.filter(function(item)
return typeof item == 'string' && item.indexOf("na") > -1;
);
La versión RegExp es similar, pero creo que generará un poco más de sobrecarga:
Array.prototype.findReg = function(match)
var reg = new RegExp(match);
return this.filter(function(item)
return typeof item == 'string' && item.match(reg);
);
Proporciona la flexibilidad para permitirle especificar un RegExp válido stringaunque.
x.findReg('a'); // returns all three
x.findReg("a$"); // returns only "banana" since it's looking for 'a' at the end of the string.
Ampliando la respuesta de @Shmiddty, aquí hay ideas útiles de JavaScript:
- Extend Array con un nuevo método:
Array.prototype.method = function(arg) return result;
- Filtrar matrices usando:
Array.filter(function(e) false; )
- Aplicar fórmula a elementos en un array:
Array.map(function(e) return formula(e); )
- Usa expresiones regulares: cualquiera
/.*na.*/
onew Regex('.*na.*')
- Use expresiones regulares para hacer coincidir:
var result = regex.test(input);
- Use Array.prototype.reduce para agregar un resultado después de ejecutar una función en cada elemento de un array
es decir, prefiero que el argumento de entrada sea una expresión regular, por lo que te da:
- Una entrada breve pero universal de coincidencia de patrones,
- por ejemplo, contiene, comienza con, termina el ancho, así como coincidencias más sofisticadas
- La capacidad de especificar un patrón de entrada como string
SOLUCIÓN 1: filtrar, probar, mapear e 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, probar
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: []
Si tienes alguna sospecha o capacidad de aumentar nuestro sección puedes realizar una ilustración y con deseo lo observaremos.