在Javascript中将Map转换为JSON对象

nix*_*get 11 javascript arrays json dictionary object

所以我得到了以下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');
Run Code Online (Sandbox Code Playgroud)

现在我想要做的是从地图中的键创建一个JSON对象.

它一定要是,

paths: {
  aliases: {
    server: {
      entry: 'src/test'
    },
    dist: {
      entry: 'dist/test'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

不确定是否有一种方法可以做到这一点.任何帮助表示赞赏.

wol*_*m77 12

MDN中给出fromEntries()自节点v12起可用:

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

const obj = Object.fromEntries(entries);

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

  • 请记住,“Map”可以保存非字符串键,因此您会在“new Map([[{x: 0, y: 1}, 42]])”上得到不良结果 (2认同)

xgq*_*rms 8

仅使用 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 }
Run Code Online (Sandbox Code Playgroud)

  1. ...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 }
Run Code Online (Sandbox Code Playgroud)

参考

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/Destructuring_assignment

https://2ality.com/2015/08/es6-map-json.html


小智 7

我希望这个功能很容易解释。这就是我以前做的工作。

/*
 * 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)
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

您可以在地图和键上循环并分配值

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);
Run Code Online (Sandbox Code Playgroud)

  • 没有 JSON 对象,只有一个遵守 javascript-object-notation 的字符串。stringify - 我认为 - 不是 op 的问题。 (3认同)
  • 不要忘了添加`JSON.stringify(object)`!(OP需要一个JSON对象...) (2认同)