简体   繁体   English

在Javascript中将Map转换为JSON对象

[英]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);

just using ES6 ways仅使用 ES6 方式

  1. 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 }

  1. ...spread & destructuring assignment ...spreaddestructuring 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 }

refs参考

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM