[英]Convert Map to JSON object in Javascript
So Ive got the following javascript which contains a key/value pair to map a nested path to a directory.所以我得到了以下 javascript,其中包含一个键/值对来将嵌套路径映射到目录。
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');
Now what I want to do is create a JSON object from the key in the map.现在我想做的是从地图中的键创建一个 JSON 对象。
It has to be,必须是,
paths: {
aliases: {
server: {
entry: 'src/test'
},
dist: {
entry: 'dist/test'
}
}
}
Not sure if there is an out of a box way to do this.不确定是否有开箱即用的方法来做到这一点。 Any help is appreciated.
任何帮助表示赞赏。
Given in MDN , fromEntries()
is available since Node v12:在MDN 中,
fromEntries()
从 Node v12 开始可用:
const map1 = new Map([
['foo', 'bar'],
['baz', 42]
]);
const obj = Object.fromEntries(map1);
// { foo: 'bar', baz: 42 }
For converting object back to map:将对象转换回地图:
const map2 = new Map(Object.entries(obj));
// Map(2) { 'foo' => 'bar', 'baz' => 42 }
I hope this function is self-explanatory enough.我希望这个功能是不言自明的。 This is what I used to do the job.
这就是我过去所做的工作。
/*
* 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)
You could loop over the map and over the keys and assign the value您可以遍历地图和键并分配值
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);
Object.fromEntries
const log = console.log; const map = new Map(); // undefined map.set(`a`, 1); // Map(1) {"a" => 1} map.set(`b`, 2); // Map(1) {"a" => 1, "b" => 2} map.set(`c`, 3); // Map(2) {"a" => 1, "b" => 2, "c" => 3} // Object.fromEntries ✅ const obj = Object.fromEntries(map); log(`\\nobj`, obj); // obj { a: 1, b: 2, c: 3 }
...spread
& destructuring assignment
...spread
和destructuring assignment
const log = console.log; const map = new Map(); // undefined map.set(`a`, 1); // Map(1) {"a" => 1} map.set(`b`, 2); // Map(1) {"a" => 1, "b" => 2} map.set(`c`, 3); // Map(2) {"a" => 1, "b" => 2, "c" => 3} const autoConvertMapToObject = (map) => { const obj = {}; for (const item of [...map]) { const [ key, value ] = item; obj[key] = value; } return obj; } const obj = autoConvertMapToObject(map) log(`\\nobj`, obj); // obj { a: 1, b: 2, c: 3 }
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
https://2ality.com/2015/08/es6-map-json.html https://2ality.com/2015/08/es6-map-json.html
Another approach.另一种方法。 I'd be curious which has better performance but jsPerf is down :(.
我很好奇哪个性能更好,但 jsPerf 已关闭 :(。
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);
Without recursion:没有递归:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.