2 votes

Comment remplacer les props imbriqués par un chemin fourni en référence ?

Comment remplacer les props imbriqués par un chemin fourni en référence ?

Voici un objet avec quelques accessoires et quelques accessoires principaux.

const obj = {
    items: {
        props: {
            prop1: {
                $ref: "#/items/props/Prop1",
            },
          prop2: {
            $ref: "#/items/props/Prop2",
          },
          prop3: {
            $ref: "#/items/props/Prop3",
          },
          prop4: {
            subItems1: {
              $ref: "#/items/props/Prop4",
            },
            subItems2: {
              $ref: "#/items/props/Prop4",
            },
          },
          prop5: {
            $ref: "#/items/props/Prop5",
          },
          prop6: {
            $ref: "#/items/props/Prop6",
          },
          prop7: {
            $ref: "#/items/props/Prop7",
          },
          Prop1: {
              nestedpropsFromProp1: {nestedSubPropsFromProp1: {}}
          },
          Prop2: {
              nestedpropsFromProp2: {nestedSubPropsFromProp2: {}}
          },
          Prop3: {
              nestedpropsFromProp3: {nestedSubPropsFromProp3: {}}
          },
          Prop4: {
              nestedpropsFromProp4: {nestedSubPropsFromProp4: {}}
          },
          Prop5: {
              nestedpropsFromProp5: {nestedSubPropsFromProp5: {}}
          },
          Prop6: {
              nestedpropsFromProp6: {nestedSubPropsFromProp6: {}}
          },
          Prop7: {
              nestedpropsFromProp6: {nestedSubPropsFromProp7: {}}
          },

        }
    }
}

résultat attendu :

const exp_obj = {
    items: {
        props: {
            prop1: {nestedSubPropsFromProp1: {}},
          prop2: {nestedSubPropsFromProp2: {}},
          prop3: {nestedSubPropsFromProp3: {}},
          prop4: {
            subItems1: {nestedSubPropsFromProp4: {}},
            subItems2: {nestedSubPropsFromProp7: {}},
          },
          prop5: {nestedSubPropsFromProp5: {}},
          prop6: {nestedSubPropsFromProp6: {}},
          prop7: {nestedSubPropsFromProp7: {}},
        }
    }
}

L'idée ici est de remplacer

            prop1: {
                $ref: "#/items/props/Prop1",
            },

avec la valeur de $ref: "#/items/props/Prop1" (partout où cette valeur est requise c'est-à-dire que si le même chemin est référencé ($ref) à plusieurs endroits, tous ces endroits seront remplacés).

de sorte que nous obtenions prop1: {nestedSubPropsFromProp1: {}}

et le pro d'origine (en majuscules, par ex. Prop1 ) seront supprimés du résultat final

La seule exigence est que chaque fois que vous rencontrez $ref -> lire la valeur correspondante (c'est-à-dire {$ref : valeur}. Cette valeur sera le chemin d'accès à la vraie Prop. & il suffit d'ajouter cette vraie Prop à l'endroit où vous avez vu $ref. C'est tout ! J'ai fourni un exemple de résultat attendu, vérifiez-le aussi!@

3voto

Dmitry Reutov Points 2851

Vous pouvez d'abord remplacer toutes les valeurs et sauvegarder les chemins et ensuite supprimer les chemins

Voici un exemple utilisant lodash fonction get

const replaceRefs = obj => {
   const refs = new Set()
   const readProps = (currentObj) => {
      if (typeof currentObj !== 'object') return 
      for (const key in currentObj) {
         if (key === '$ref') {
            const refPath = currentObj[key].substr(2).replace(/\//g, '.')
            currentObj[key] = _.get(obj, refPath) 
            refs.add(refPath)
         } else {
            readProps(currentObj[key])
         }
      } 
   }

   readProps(obj)
   refs.forEach(ref => {
      const parts = ref.split('.')
      const key = parts.pop()

      delete _.get(obj, parts.join('.'))[key]
   })

}

1voto

user120242 Points 1280

Mutations sur l'objet. Utilise un Map() pour stocker les [$ref]:références aux objets.
Parcourt les objets de manière récursive pour trouver $ref, puis parcourt les chemins.
Suppose que tous les chemins sont au format #/path/path/...

Note : Vous n'avez pas précisé comment traiter les $refs invalides. Je les remplace simplement par undefined pour le moment. Du code a été ajouté pour gérer cela, car les chemins dans l'exemple ne sont pas tous valides.
Note : Les mêmes références font référence au même objet. La mutation de l'une d'entre elles entraînera la mutation de toutes celles qui pointent vers le même chemin. C'est délibéré. Ajoutez le clonage si vous voulez éviter cela.

const map = new Map()
walk = node => {
  if(typeof node!=='object') return
  Object.keys(node).forEach(k=>{
    if(!node[k]) return
    const {$ref} = node[k]
    if($ref) {
      if(!map.has($ref)){
        const dir = $ref.substr(2).split('/'),
              name = dir.pop()
        let ptr = obj
        for(const p of dir) if(!(ptr = ptr[p])) break

        map.set($ref, ptr && ptr[name])
        if(ptr) delete ptr[name]
      }

      node[k] = map.get($ref)
      delete node[k].$ref
    }
    else walk(node[k])
  })
}

walk(obj)

console.log(obj)

<script>
const obj = {
    items: {
        props: {
            prop1: {
                $ref: "#/items/props/Prop1",
            },
          prop2: {
            $ref: "#/items/props/Prop2",
          },
          prop3: {
            $ref: "#/items/props/Prop3",
          },
          prop4: {
            subItems1: {
              $ref: "#/items/props/Prop4",
            },
            subItems2: {
              $ref: "#/items/props/Prop4",
            },
          },
          prop5: {
            $ref: "#/items/props/Prop5",
          },
          prop6: {
            $ref: "#/items/props/Prop6",
          },
          prop7: {
            $ref: "#/items/props/Prop7",
          },
          Prop1: {
              nestedpropsFromProp1: {nestedSubPropsFromProp1: {}}
          },
          Prop2: {
              nestedpropsFromProp2: {nestedSubPropsFromProp2: {}}
          },
          Prop3: {
              nestedpropsFromProp3: {nestedSubPropsFromProp3: {}}
          },
          Prop4: {
              nestedpropsFromProp4: {nestedSubPropsFromProp4: {}}
          },
          Prop5: {
              nestedpropsFromProp5: {nestedSubPropsFromProp5: {}}
          },
          Prop6: {
              nestedpropsFromProp6: {nestedSubPropsFromProp6: {}}
          },
          Prop7: {
              nestedpropsFromProp6: {nestedSubPropsFromProp7: {}}
          },

        }
    }
}
</script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X