Javascript 在Javascript中将Map转换为JSON对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37437805/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 20:20:12  来源:igfitidea点击:

Convert Map to JSON object in Javascript

javascriptarraysjsonobjectdictionary

提问by nixgadget

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.

不确定是否有开箱即用的方法来做到这一点。任何帮助表示赞赏。

采纳答案by Nina Scholz

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);

回答by wolfram77

Given in MDN, fromEntries()is available since Node v12:

MDN 中给出fromEntries()从 Node v12 开始可用:

const entries = new Map([
  ['foo', 'bar'],
  ['baz', 42]
]);

const obj = Object.fromEntries(entries);

console.log(obj);
// expected output: Object { foo: "bar", baz: 42 }

回答by Zachary Taylor

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)

回答by IMTheNachoMan

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);