Clojure: recorrer mapas de vectores y agregar elementos que se repiten
Espero que todos estén bien. Bueno, soy nuevo en la programación de Clojure y me gustaría un poco de ayuda. Tengo el siguiente vector de mapas:
(def curves [{:curve_buyer “curve1” :curve_seller “curve2” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curve3” :quantity 2 :value 4}
{:curve_buyer “curve3” :curve_seller “curve2” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curve3” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curve2” :quantity 4 :value 4}
{:curve_buyer “curve1” :curve_seller “curve3” :quantity 2 :value 4}])
Necesito hacer una verificación en ese vector, donde comprueba las claves (:curve_buyer y :curve_seller) que tienen el mismo valor. Si tienen el mismo valor, necesito agregar la cantidad y el valor, de lo contrario, devolver el mapa tal como está. Tomando el mapa anterior, tendría el siguiente resultado:
(def curves [{:curve_buyer “curve1” :curve_seller “curve2” :quantity 6 :value 7}
{:curve_buyer “curve2” :curve_seller “curve3” :quantity 2 :value 4}
{:curve_buyer “curve3” :curve_seller “curve2” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curva3” :quantity 4 :value 7}])
Necesito una función que haga esto. Cualquier forma utilizando las funciones de Clojure o una idea de una función que pueda resolver mi problema.
Gracias por su atención y estoy dispuesto a cualquier aclaración.
davy.ai
Para resolver este problema, puede usar la función
group-by
para agrupar el vector de mapas por los valores comunes de:curve_buyer
y:curve_seller
. Después de eso, itere a través de los grupos y fusiona los mapas que tienen los mismos valores para las claves:curve_buyer
y:curve_seller
, mientras suma los valores de las claves:quantity
y:value
. Aquí hay una función de ejemplo que hace esto:Así es cómo puedes usar esta función con tu vector de entrada:
Esto producirá la siguiente salida:
Esta es la salida esperada que fusiona los mapas con los mismos valores para
:curve_buyer
y:curve_seller
, mientras suma los valores de:quantity
y:value
.