La función que toma un objeto y un obj consultorio que intenta regexp coincide con sus valores -- javascript campo con functional-programming camp codereview Relacionados El problema

Function that takes an object and a query obj that tries to regexp matches its values


1
vote

problema

Español

Tengo el método de seguimiento que debe hacer:

  INT_MIN1  

quería: Debido a que planeo usar esta función, INT_MIN2 en INT_MIN3 , debe tomar un 99887766555443324 y devuelve una función que puede tomar un objeto para la verificación de igualdad contra esa consulta. Mi versión anterior hace eso, la mejora buscada es podemos extraer el

INT_MIN5

fuera para que pueda en el futuro cambiarlo por alguna función que devuelve un valor booleano?

¿Hay alguna forma de que el mapa interior de ITERATEE pueda dividirse en dos de este tipo que el estado se pase por separado? De esa manera, puedo refactorizar el INT_MIN6 Parte como una función independiente.

Original en ingles

I have the follow matcher method that should do:

obj = {eins: 'one', zwei: 'two'} queryA = {eins: 'one'} queryB = {eins: 'one', zwei: 'deux'}  matcher(obj, queryA) // true matcher(obj, queryB) // false  const matcher = curryRight(   (state, query) =>      flowRight([       every(Boolean),       map(         (val, key) => {           return  state[key] && state[key].match(new RegExp(val, 'ig'))         }       )     ])(query) ) 

Wanted: Because I plan on using this function, matcher() in filter(), it should take a query and returns a function which can take an object for equality check against that query. My version above does that, the improvement sought is can we extract the

(val, key) => { return state[key] && state[key].match(new RegExp(val, 'ig')) }

out so that I can in the future swap it out for some function which returns a boolean value?

Is there any way that the iteratee inside map may be split into two such that state is passed in separately? That way, I can refactor the .match(...) part out as a standalone function.

     

Lista de respuestas

1
 
vote

He revisado su código y puedo realizar las siguientes observaciones:

Conceptos FP

Entiendo que desea resolver el problema de coincidir los objetos a las consultas. Si pasa un objeto y una consulta, debería poder verificar si la consulta satisface todas las partes o no. Sin embargo, para ser honesto contigo, intentas demasiado en la dirección equivocada. Todo ese curryRight , flowRight , partial es muy interesante y útil, pero en el programador promedio realmente no significa nada para el problema que usted están tratando de abordar.

Por ejemplo, pude reescribir el código usando la cadena de alboroto en 5 minutos y con mejor legibilidad. Publicaré mi código al final, pero antes de eso comentaré algunas cosas:

matcher(obj, queryA)3 : ¿Por qué el nombre coincidente? ¿Qué coincide? Un objeto, una matriz? Creo que es demasiado genérico y confuso. ¿Y por qué acepta 2 parámetros? Idealmente, debería aceptar solo uno en el momento. Debería haber sido como makeMatcher(obj) => (query) => ... y ahora tendría más flexibilidad con el nombramiento.

const matcher = curryRight( (state, query) => flowRight([ every(Boolean), map( (val, key) => { return state[key] && state[key].match(new RegExp(val, 'ig')) } ) ])(query)

Esto se ve demasiado esotérico y tuve que buscar la documentación para flowRight y 9988776655544337 y después de eso tuve que ejecutar su código al navegador con puntos de interrupción para entender Los internos, etc., en algún momento que me detuve porque pensé que ya me tomó el tiempo suficiente y no vale la pena. Es claramente demasiado complicado de leer y entender, no solo ahora, sino también en 2 años, cuando revisa su código y piense qué exactamente quiso hacer. Mi punto es que en el estado actual no es mantenible.

de todos modos aquí es mi opinión sobre esto:

  const makeMatcher = (obj) => (query) => {   const matchesQuery = (val, key) => {     return obj[key] && obj[key].includes(query[key]);   };    return _(query)           .chain()           .map(matchesQuery)           .every(Boolean)           .value(); }   const objMatches = makeMatcher(obj); objMatches(queryA); // True objMatches(queryB); // False   

Nota cómo el código habla de sí mismo y no tiene que exagerar. Cada nombre tiene un significado con la intención correcta. Un makeMatcher hace que los matrizadores y un 99887766555443310 devuelven un booleano aceptando una consulta y comprobación de la consulta.

Dentro del flowRight1 Simplemente cadenas sobre la consulta y validamos que cada parámetro de consulta coincide con el objeto o en el caso de un desajuste que devolvamos falso y eso es.

Mi punto es que siempre debe tener una vista visual de los pájaros de su código e intente pensar en formas de hacer que su trabajo sea más fácil de manejar. Busque alternativas y no caiga en el agujero de conejo de aplicar cosas que no encajan con precisión. Siempre hay un método más simple para hacer su trabajo. Buena suerte con tus esfuerzos de FP.

 

I have reviewed your code and I can make the following remarks:

FP concepts

I understand that you want to solve the issue of matching objects to queries. If you pass an object and a query you should be able to check if the query satisfies all parts or no. However to be honest with you you try too much in the wrong direction. All that curryRight, flowRight, partial etc are very interesting and useful but in the average programmer they don't really mean anything for the problem you are trying to tackle.

For example I was able to rewrite the code using lodash chain in 5 minutes and with better readability. I will post my code at the end but before that I'll comment a few things:

matcher(obj, queryA): Why the name matcher? What does it matches? An object, an array? I think its too generic and confusing. And why does it accepts 2 parameters? Ideally it should accept only one at the time.It should have been like makeMatcher(obj) => (query) => ... and now you would have more flexibility with naming.

const matcher = curryRight( (state, query) => flowRight([ every(Boolean), map( (val, key) => { return state[key] && state[key].match(new RegExp(val, 'ig')) } ) ])(query)

This looks too esoteric and I had to search for the documentation for both flowRight and curryRight and after that I had to run your code to the browser with breakpoints to understand the internals etc. At some point I stopped because I thought it took me enough time already and its not worth it. Its clearly too complicated to read and to understand, not only now but also in 2 years time when you revisit your code and think what exactly did you meant to do. My point is that in the current state is un-maintainable.

Anyway here is my take on this:

const makeMatcher = (obj) => (query) => {   const matchesQuery = (val, key) => {     return obj[key] && obj[key].includes(query[key]);   };    return _(query)           .chain()           .map(matchesQuery)           .every(Boolean)           .value(); }   const objMatches = makeMatcher(obj); objMatches(queryA); // True objMatches(queryB); // False 

Note how the code speaks of its self and it doesn't have to exaggerate. Every name has a meaning with the right intent. A makeMatcher makes matchers and an objMatches returns a boolean by accepting a query and checking if its matches the query.

Inside the makeMatcher we simply chain over the query and validate that either every query parameter matches the object or in case of a mismatch we return false and that's it.

My point is that you should always have a birds eye view of your code and try to think of ways to make your work easier to handle. Search for alternatives and don't fall into the rabbit hole of applying things that they don't fit accurately. There is always a simpler method to do your job. Good luck with your FP endeavors.

 
 
 
 

Relacionados problema

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...

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...

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...

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...

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...

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 ...

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...

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...




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