如何将 JavaScript ES6 映射对象显示到控制台?

new*_*guy 11 javascript dictionary ecmascript-6 console.log ecmascript-2016

我正在使用 repl.it/languages/javascript

我是否必须在打印之前将其转换为对象?

我试过了

    const mapObject = new Map();
    
    mapObject.set(1, 'hello');
    
    console.log(JSON.stringify(mapObject));
    console.log(mapObject);
Run Code Online (Sandbox Code Playgroud)

结果总是空对象。

当我使用

console.log([...mapObject]);
Run Code Online (Sandbox Code Playgroud)

它打印出一个数组格式。

sam*_*war 11

您可以尝试更简单的解决方案。

 const mapObject = new Map();   
 mapObject.set(1, 'hello');

 console.log([...mapObject.entries()]);
 // [[1, "hello"]]

 console.log([...mapObject.keys()]);
 // [1]

 console.log([...mapObject.values()]);
 // ["hello"]
Run Code Online (Sandbox Code Playgroud)


ggo*_*len 7

对于深度为 1 的简单映射,只需将Object.fromEntries([...map])对象条目数组转换回控制台可记录对象:

const simpleObj = {
  a: [1, 2, 3],
  b: {c: {d: 42}}
};
const map = new Map(Object.entries(simpleObj));
console.log(Object.fromEntries([...map]));
Run Code Online (Sandbox Code Playgroud)

然而,这对于复杂的嵌套映射来说是失败的。为此,我们可以递归地将任何Maps 转换为对象,然后正常记录它。Map这是一个结合了普通对象、数组和基元的复杂结构的概念验证。不要指望它能够覆盖所有开箱即用的边缘情况,但请随意指出改进。

const convertMapToObjDeeply = o => {
  const recurseOnEntries = a => Object.fromEntries(
    a.map(([k, v]) => [k, convertMapToObjDeeply(v)])
  );
  
  if (o instanceof Map) {
    return recurseOnEntries([...o]);
  }
  else if (Array.isArray(o)) {
    return o.map(convertMapToObjDeeply);
  }
  else if (typeof o === "object" && o !== null) {
    return recurseOnEntries(Object.entries(o));
  }
  
  return o;
};

const mkMap = o => new Map(Object.entries(o));

const map = mkMap({
  a: 42, 
  b: [1, 2, 3, mkMap({d: mkMap({ff: 55})})],
  c: mkMap({
    e: [4, 5, 6, {f: 5, x: y => y}, mkMap({g: z => 1})]
  }),
  h: {i: mkMap({j: 46, jj: new Map([[[1, 6], 2]])})},
  k: mkMap({l: mkMap({m: [2, 5, x => x, 99]})})
});

console.log(convertMapToObjDeeply(map));
Run Code Online (Sandbox Code Playgroud)


小智 7

我意识到这很可能是针对浏览器控制台的,但这种情况也发生在 Node.js 中。因此,您可以在 Node 中使用它来查看地图(或可能包含地图的对象):

import * as util from "util";

const map: Map<string, string> = new Map();
map.set("test", "test");

const inspected: string = util.inspect(map);

console.log(inspected);
Run Code Online (Sandbox Code Playgroud)


use*_*291 5

注意:此答案仅与 OP 使用的 repl.it 沙箱环境相关

由于您在评论中说您正在使用repl.it,因此您可以使用一个技巧来编写自己的“日志记录策略”。

请注意,您不应在生产中使用此技巧,主要是因为它会编辑本机原型。在某些 Node 环境中,在您自己的代码中,它可能很有用。

这个想法是创建一个inspect方法来Map迭代entries

Map.prototype.inspect = function() {
  return `Map(${mapEntriesToString(this.entries())})`
}

function mapEntriesToString(entries) {
  return Array
    .from(entries, ([k, v]) => `\n  ${k}: ${v}`)
    .join("") + "\n";
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处看到 repl.it 支持它

console.log(new Map([["a", 1], ["b", 2]]));
// Logs:
/*
Map(
  a: 1
  b: 2
)
*/
Run Code Online (Sandbox Code Playgroud)

  • 好一个。我刚刚完成了类似的事情,但我选择将他们的 `console.log` 混为一谈 :) https://repl.it/KBdU (2认同)