J'ai eu une exigence similaire, je veux utiliser une carte d'objet pour éviter d'avoir des chaînes magiques dans mon code. Par exemple, je veux avoir une carte de messages comme:
var message = {
configuration:
{
pdms:
{
type: {
getTypes: {},
getDatabases: {}
}
}
}
};
maintenant au lieu d'utiliser une chaîne comme:
"message.configuration.pdms.type.getTypes"
Je veux utiliser:
message.configuration.pdms.type.getTypes
Et convertir cela en une chaîne. Pour cela, j'utilise la fonction d'utilité suivante. Notez que la bibliothèque underscore est requise.
var objectToString = (orig, string, obj) => {
var parse = (orig, string, obj) => {
return _.map(_.keys(orig), (key) => {
if (_.isEmpty(orig[key])) {
return orig[key] === obj ? string + '.' + key : '';
} else {
return objectToString(orig[key], string + '.' + key, obj);
}
});
};
return _.chain(parse(orig, string, obj))
.flatten()
.find ((n) => {return n.length > 0;})
.value();
};
Pour le rendre plus pratique appliquer, je partielle cette fonction avec l'objet source de se tourner vers les chaînes et l'espace de noms racine.
var messageToString = _.partial(objectToString, message, 'message');
messageToString(message.configuration.pdms.type.getTypes);
// returns: 'message.configuration.pdms.type.getTypes'
Oui, je sais. Je l'ai déjà utilisé, très utile. Mais ce n'est pas ce que j'ai cherché. –