¿Mejor manera de escribir este código de manera funcional usando el mapa y reduce? -- javascript campo con functional-programming camp codereview Relacionados El problema

Better way to write this code in functional manner using map and reduce?


3
vote

problema

Español

Tengo una variedad de elementos en los que tengo que realizar 2 tareas:

  1. aplicando una función en el artículo de la matriz
  2. verificando si el valor es verdadero o falso.

El enfoque funcional para resolver esto sería

  GoogleApiClient3  

Pero aquí la matriz GoogleApiClient4 se atraviesa dos veces en comparación con

  GoogleApiClient5  

¿No es el enfoque funcional malo en este caso o no estoy usando GoogleApiClient6 y GoogleApiClient77 de la manera correcta?

Original en ingles

I have an array of items on which I have to perform 2 tasks:

  1. Applying a function on the array item
  2. Checking if the value is true or false.

The functional approach to solving this would be

var result = arr.map(function(item){return some_action(item);}).filter(function(item){return other_action(item) == true;}); 

But here the array arr is traversed twice in comparison to

var result = []; arr.forEach(function(item){     var x = other_action(some_action(item));     if (x)         result.push(x); }); 

Isn't the functional approach bad in this case or am I not using map and filter the right way?

     

Lista de respuestas

8
 
vote

Su enfoque "funcional" es demasiado complicado. Observe que esto es completamente equivalente:

  var result = arr.map(some_action).filter(other_action);   

es. Si solo está delegando con otra función, puede especificar esa función directamente. Además, una prueba == true es superfluo.

Su variante "procedimiento" no es equivalente, eso tendría que ser:

  var result = []; arr.forEach(function(item){     var changedItem = some_action(item);     if (other_action(changedItem))         result.push(changedItem); });   

Tenga en cuenta que ambas variantes tienen la misma complejidad algorítmica , y que el costo de la iteración es probable es probable que sea insignificante en comparación con el costo de some_action y 99887766555443310 .

La programación funcional no significa un código ilegible. Incluso si no está delegando otra función, podría mejorar el formato, por ejemplo. a

  fvC 1  
 

Your xe2x80x9cfunctionalxe2x80x9d approach is overly complicated. Notice that this is completely equivalent:

var result = arr.map(some_action).filter(other_action); 

I.e. If you're only delegating to another function, you can specify that function directly. Also, an == true test is superfluous.

Your xe2x80x9cproceduralxe2x80x9d variant is not equivalent, that would have to be:

var result = []; arr.forEach(function(item){     var changedItem = some_action(item);     if (other_action(changedItem))         result.push(changedItem); }); 

Note that both variants have the same algorithmic complexity, and that the cost of iteration is likely negligible compared with the cost of some_action and other_action.

Functional programming does not mean unreadable code. Even if you're not just delegating to another function, you could improve formatting, e.g. to

var result = arr.map(function (item) {   return some_action(item); }).filter(function (item) {   return other_action(item); }); 
 
 
 
 
5
 
vote

Tus bucles no son equivalentes. En el primero, result será arr mapeado con alguna acción, mientras que en el segundo puede hacerlo solo con un filtro.

La forma equivalente de escribir el bucle forEach sería usar result.push(some_action(item)) . Por supuesto, lo cambiaría como use some_action(item) anteriormente en la función.

La forma equivalente de escribir su forEach bucle con solo 9988776655544336 sería

  arr.filter(function(item){return other_action(some_action(item));});   

también, ya que esta es una revisión del código, me gustaría señalar que probablemente puede escribir

  arr.map(function(item){return some_action(item);})   

como

  arr.map(some_action) //note this is not equivalent if some_action can take multiple params.   

De todos modos, usted es correcto en esa llamada, estos métodos de bucle tomarán 99887776655443310 TIME por llamada y es una buena idea aplicar los filtros primero en limitar arr1 . Si está buscando una lea interesante, eche un vistazo a la documentación lazy.js .

edit , simplemente notado, porque menciona la reducción, la forma en que escribiría esto con la reducción es similar a usted 99887776655443312 manera

  arr3  
 

Your loops are not equivalent. In the first one result will be arr mapped with some action, while in the second you could do that just using a filter.

The equivalent way of writing the forEach loop would be to use result.push(some_action(item)). Of course you would cache it as you use some_action(item) earlier in the function.

The equivalent way of writing your forEach loop with just filter would be

arr.filter(function(item){return other_action(some_action(item));}); 

Also, as this is code review I would like to point out you can probably write

arr.map(function(item){return some_action(item);}) 

As

arr.map(some_action) //note this is not equivalent if some_action can take multiple params. 

Anyway, you are correct in that calling these loop methods will take O(n) time per call and it's a good idea to apply filters first to limit n. If you're looking for an interesting read take a look at the Lazy.js documentation.

Edit, just noticed, because you mention reduce, the way you'd write this with reduce is akin to you forEach way

arr.reduce(function(result, item){     var item = other_action(some_action(item));     if (item) result.push(item);     return result; }, []); 
 
 
-1
 
vote

No hagas esto:

  arr4  

Si otra_acción () devuelve Falso, la posición del elemento en la matriz será indefinida.

 

Don't do this:

 var result = arr.map(function(item){           var result=some_action(item);           if(other_action(result)){                return result;           }   }); 

if other_action() return false, the item position in array will be undefined.

 
 
   
   

Relacionados problema

3  Definiendo la transposición en una colección de colecciones irregulares  ( Defining transpose on a collection of irregular collections ) 
Me pidieron que presentara mi solicitud de revisión de código en https: //stackoverflow.com/questions/10672046/defining-transpose-on-a-collection-of-irregula...

9  Eliminación de árbol negro rojo en F #  ( Deleting from red black tree in f ) 
Sí, estoy muy lentamente a través de las estructuras de datos puramente funcionales. Así que pasé por la sección sobre árboles negros rojos. Lo que presenta e...

18  Reemplazo de clases de Python con módulos [cerrados]  ( Replacing python classes with modules ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

10  Obteniendo la última fecha donde ocurrió un día de la semana dado  ( Getting the last date where a given week day occurred ) 
Estoy tratando de aprender un poco sobre la programación funcional y como mi herramienta, elegí F # ya que soy un desarrollador de .NET y el medio ambiente es...

3  ¿Quick-Sort una lista vinculada?  ( Quick sort a linked list ) 
Tengo un pequeño proyecto donde estoy implementando una lista de enlaces inmutables (no solo ...) basada en una estructura de pares como la celda de los contr...

2  HackerRank: Rotación de la matriz izquierda en Python  ( Hackerrank left array rotation in python ) 
Aquí está el problema en Hackerrank . Quiero saber cómo puedo mejorar este código. Estoy tratando principalmente de mejorar las siguientes habilidades: la do...

1  Implementación ingenua de la memorización automática  ( Naive implementation of automatic memoisation ) 
Escribí el código a (ingenuamente) realizar la memorización automática. Intenté escribirlo en un estilo de programación funcional, y así no hizo uso de ningun...

25  Proyecto EULER PROBLEMA 2 EN COTJURE  ( Project euler problem 2 in clojure ) 
Estoy en el proceso de aprendizaje de Clojure. Soy bastante nuevo en la programación funcional y me gustaría saber si mi código huele o si hay alguna implicac...

4  Simple Haskell Key Value File Store  ( Simple haskell key value file store ) 
Como ejercicio en el aprendizaje de Haskell, implementé una tienda de valores clave simple, donde puede poner y obtener valores (como ByteString s). (Para r...

13  Muestreo de reservorio en Clojure  ( Reservoir sampling in clojure ) 
Estoy aprendiendo a Clojure y decidí comenzar por intentar escribir una solución a un algoritmo bastante simple, un muestreo de reservorio. Como dije, estoy a...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos