Donc j’ai le javascript suivant qui contient une paire clé/valeur pour mapper un chemin imbriqué dans un répertoire.
function createPaths(aliases, propName, path) {
aliases.set(propName, path);
}
map = new Map();
createPaths(map, 'paths.aliases.server.entry', 'src/test');
createPaths(map, 'paths.aliases.dist.entry', 'dist/test');
Maintenant, ce que je veux faire est de créer un objet JSON à partir de la clé de la carte.
Ça doit être,
paths: {
aliases: {
server: {
entry: 'src/test'
},
dist: {
entry: 'dist/test'
}
}
}
Je ne sais pas s'il existe un moyen hors du commun de le faire. Toute aide est appréciée.
Vous pouvez faire une boucle sur la carte et sur les touches et attribuer la valeur
function createPaths(aliases, propName, path) {
aliases.set(propName, path);
}
var map = new Map(),
object = {};
createPaths(map, 'paths.aliases.server.entry', 'src/test');
createPaths(map, 'paths.aliases.dist.entry', 'dist/test');
map.forEach((value, key) => {
var keys = key.split('.'),
last = keys.pop();
keys.reduce((r, a) => r[a] = r[a] || {}, object)[last] = value;
});
console.log(object);
Une autre approche. Je serais curieux de savoir qui a de meilleures performances mais jsPerf est en panne :(.
var obj = {};
function createPaths(map, path, value)
{
if(typeof path === "string") path = path.split(".");
if(path.length == 1)
{
map[path[0]] = value;
return;
}
else
{
if(!(path[0] in map)) map[path[0]] = {};
return createPaths(map[path[0]], path.slice(1), value);
}
}
createPaths(obj, 'paths.aliases.server.entry', 'src/test');
createPaths(obj, 'paths.aliases.dist.entry', 'dist/test');
console.log(obj);
Sans récursion:
var obj = {};
function createPaths(map, path, value)
{
var map = map;
var path = path.split(".");
for(var i = 0, numPath = path.length - 1; i < numPath; ++i)
{
if(!(path[i] in map)) map[path[i]] = {};
map = map[path[i]];
}
map[path[i]] = value;
}
createPaths(obj, 'paths.aliases.server.entry', 'src/test');
createPaths(obj, 'paths.aliases.dist.entry', 'dist/test');
createPaths(obj, 'paths.aliases.dist.dingo', 'dist/test');
createPaths(obj, 'paths.bingo.dist.entry', 'dist/test');
console.log(obj);
var obj = {};
function createPaths(map, path, value)
{
var map = map;
var path = path.split(".");
while(path.length > 1)
{
map = map[path[0]] = map[path.shift()] || {};
}
map[path.shift()] = value;
}
createPaths(obj, 'paths.aliases.server.entry', 'src/test');
createPaths(obj, 'paths.aliases.dist.entry', 'dist/test');
createPaths(obj, 'paths.aliases.dist.dingo', 'dist/test');
createPaths(obj, 'paths.bingo.dist.entry', 'dist/test');
console.log(obj);
J'espère que cette fonction est suffisamment explicite. C'est ce que j'avais l'habitude de faire.
/*
* Turn the map<String, Object> to an Object so it can be converted to JSON
*/
function mapToObj(inputMap) {
let obj = {};
inputMap.forEach(function(value, key){
obj[key] = value
});
return obj;
}
JSON.stringify(returnedObject)