es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Golang – Generar mapa con relación uno a muchos

Soy un traductor de español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Soy bastante nuevo en golang y estoy luchando para generar un mapa de relación uno a muchos a partir de un mapa existente.

Aquí está mi script playground.

Explicación:-
Estoy tratando de lograr la relación de cada elemento de la posición 0 con cada elemento de la posición 1,2,…nth.

Por ejemplo – [0][0]=>[1][0], [0][0]=>[1][1], [0][1]=>[1][0], [0][1]=>[1][1], [0][0]=>[2][0], [0][1]=>[2][1]

Salida final que estoy tratando de lograr –

Array(
[0] => Array
(
[0] => Array
(
[room_rate_key] => 0|0
[amount] => 5307.84
)
[1] => Array
(
[room_rate_key] => 0|0
[amount] => 5307.84
)
)
[1] => Array
(
[0] => Array
(
[room_rate_key] => 0|0
[amount] => 5307.84
)
[1] => Array
(
[room_rate_key] => 0|1
[amount] => 5246.98
)
)
[2] => Array
(
[0] => Array
(
[room_rate_key] => 0|1
[amount] => 5246.98
)
[1] => Array
(
[room_rate_key] => 0|0
[amount] => 5307.84
)
)
[3] => Array
(
[0] => Array
(
[room_rate_key] => 0|1
[amount] => 5246.98
)
[1] => Array
(
[room_rate_key] => 0|1
[amount] => 5246.98
)
)
)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para generar un mapa de relación uno a muchos a partir de un mapa existente en Golang, se pueden utilizar loops anidados para iterar sobre las claves y valores del mapa original y crear un nuevo mapa que asocie cada clave con múltiples valores.

    Aquí hay un ejemplo de implementación de este enfoque que debería lograr el resultado deseado:

    package main
    
    import (
        "fmt"
        "strconv"
    )
    
    func main() {
        originalMap := map[string]map[string]interface{}{
            "0|0": {"room_rate_key": "0|0", "amount": 5307.84},
            "0|1": {"room_rate_key": "0|1", "amount": 5246.98},
        }
    
        // Crear un nuevo mapa para almacenar la relación uno a muchos
        newMap := make(map[string][]map[string]interface{})
    
        // Iterar sobre las claves y valores del mapa original
        for firstKey, firstValue := range originalMap {
            for secondKey, secondValue := range originalMap {
                // Comprobar si la primera clave no es igual a la segunda clave
                if firstKey != secondKey {
                    // Comprobar si la primera clave ya está en el nuevo mapa
                    if _, ok := newMap[firstKey]; !ok {
                        newMap[firstKey] = []map[string]interface{}{}
                    }
    
                    // Agregar el segundo valor a la lista de valores asociados con la primera clave
                    newMap[firstKey] = append(newMap[firstKey], secondValue)
    
                    // Imprimir la relación con fines de depuración
                    fmt.Printf("[%s] => [%s]\n", firstKey, secondKey)
                }
            }
        }
    
        // Imprimir el mapa final con fines de depuración
        fmt.Println(newMap)
    
        // Formatear la salida final para que coincida con el formato deseado
        finalOutput := make([][]map[string]interface{}, len(originalMap))
        for i := range finalOutput {
            finalOutput[i] = make([]map[string]interface{}, len(originalMap)-1)
        }
    
        for i, firstValue := range originalMap {
            for j, secondKey := 0, 0; j < len(originalMap); j++ {
                if firstKey != strconv.Itoa(j) + "|" + strconv.Itoa(secondKey) {
                    finalOutput[i][j-1] = map[string]interface{}{
                        "room_rate_key": secondKey,
                        "amount": firstValue["amount"],
                    }
                } else {
                    finalOutput[i][j-1] = originalMap[strconv.Itoa(j) + "|" + strconv.Itoa(secondKey)]
                }
            }
        }
    
        fmt.Println(finalOutput)
    }
    

    Esta implementación primero crea un nuevo mapa con una lista vacía para cada clave en el mapa original. Luego itera sobre las claves y valores del mapa original dos veces para comparar cada par de claves. Si las claves son diferentes, agrega el segundo valor a la lista asociada con la primera clave en el nuevo mapa.

    La implementación luego formatea la salida final para que coincida con el formato deseado creando un slice bidimensional con las mismas dimensiones que el mapa original. Luego itera sobre las claves y valores del mapa original y asigna cada valor a la posición apropiada en el slice según la relación uno a muchos en el nuevo mapa.

    Esta implementación debería producir el resultado deseado para los datos de entrada en el script proporcionado.

Comments are closed.