2010-03-14 21 views
13

Como una continuación de mi mínimo/máximo en una matriz de objetos, me preguntaba acerca de las comparaciones de rendimiento de filtro frente a mapa.Problema con el mapa de filtro de Javascript

Así que hice una prueba de los valores en mi código ya que iba a ver los resultados en FireBug.

Este es el código:

var _vec = this.vec; 
min_x = Math.min.apply(Math, _vec.filter(function(el){ return el["x"]; })); 
min_y = Math.min.apply(Math, _vec.map(function(el){ return el["x"]; })); 

La versión map ped devuelve el resultado correcto. Sin embargo, la versión ed filter devuelve NaN. Rompiéndolo, entrando y finalmente inspeccionando los resultados, parece que la función interna devuelve la propiedad x de _vec, pero la matriz real devuelta desde filter es _vec sin filtro.

Creo que el uso de filter es correcto. ¿Alguien más puede ver mi problema?

Aquí es una prueba sencilla:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
<title>S:GTC Map Test</title> 
</head> 
<body> 
<script type="text/javascript"> 
function vector(x,y,z) { this.x = x; this.y =y; this.z=z; } 
var vec = []; 
vec.push(new vector(1,1,1)); 
vec.push(new vector(2,2,2)); 
vec.push(new vector(2,3,3)); 
var _vec = vec; 
min_x = Math.min.apply(Math, _vec.filter(function(el){ return el["x"]; })); 
min_y = Math.min.apply(Math, _vec.map(function(el){ return el["x"]; })); 

document.write("<br>filter = " + min_x); 
document.write("<br>map = " + min_y); 
</script> 
</body> 
</html> 

Respuesta

34

No, el método filter no devuelve la matriz unfiletered. Devuelve una matriz que contiene los elementos donde la función interna devuelve verdadero.

Como no devuelve un valor booleano de la función interna, el valor se convierte en booleano, por lo que la referencia del objeto se convierte en verdadero. Por lo tanto, devuelve una nueva matriz que contiene todos los elementos de la matriz original.

El método filter no hace lo mismo que el método map. El método map se usa para convertir cada elemento de una matriz, mientras que el método filter se usa para seleccionar ciertos elementos de una matriz. Comparar el rendimiento entre los métodos es discutible, ya que solo uno de ellos hace lo que quiere hacer.

+2

Ahh. Parece que no entendí cómo funciona el filtro functon. Tenía la impresión de que devolvía un objeto modificado a una matriz. –

4

Citado de:

JavaScript: La guía definitiva
por David Flanagan

mapa()

El método map() pasa cada elemento de la matriz sobre la que es invocado a la función que especifique, y devuelve una matriz que contiene los valores devueltos por esa función.

Por ejemplo:

a = [1, 2, 3]; 

b = a.map(function(x) { return x*x; }); // b is [1, 4, 9] 

La función se pasa al mapa() es invocada en la misma forma que una función pasado a forEach(). Para el método map(), sin embargo, la función que pasa debe devolver un valor. Tenga en cuenta que map() devuelve una nueva matriz : no modifica la matriz en la que se invoca. Si esa matriz es dispersa, la matriz devuelta será dispersa de la misma manera: tendrá tiene la misma longitud y los mismos elementos faltantes.

filtro()

El método devuelve una matriz que contiene un subconjunto de los elementos de la matriz en el que se invoca. La función que le pasa debe ser predicado: una función que devuelve verdadero o falso. El predicado es invocado al igual que forEach() y map(). Si el valor de retorno es verdadero, o un valor que se convierte en verdadero, entonces el elemento pasado al predicado es un miembro del subconjunto y se agrega a la matriz que se convertirá en el valor de retorno.

Ejemplos:

a = [5, 4, 3, 2, 1]; 

smallvalues = a.filter(function(x) { return x < 3 }); // [2, 1] 

everyother = a.filter(function(x,i) { return i%2==0 }); // [5, 3, 1] 
Cuestiones relacionadas