ฉันจะแสดง JavaScript ES6 Map Object ไปยังคอนโซลได้อย่างไร

ฉันใช้ repl.it/languages/javascript

ฉันต้องแปลงเป็นวัตถุก่อนที่จะพิมพ์ออกมาหรือไม่

ฉันพยายามแล้ว

    const mapObject = new Map();
    
    mapObject.set(1, 'hello');
    
    console.log(JSON.stringify(mapObject));
    console.log(mapObject);

ผลลัพธ์จะเป็นวัตถุว่างเปล่าเสมอ

เมื่อฉันใช้

console.log([...mapObject]);

มันพิมพ์ออกมาในรูปแบบอาร์เรย์


comment
console.log(mapObject) ทำงานได้ดีใน Chrome และ node7 ล่าสุด แพลตฟอร์มของคุณคืออะไร?   -  person georg    schedule 08.08.2017
comment
@georg repl.it/languages/javascript   -  person newguy    schedule 08.08.2017
comment
ใช้ console.dir แทน .log และไม่มีสตริง   -  person Teemu    schedule 08.08.2017
comment
@newguy: แล้วคุณจะวางสายและขอให้แก้ไขได้อย่างไร?   -  person georg    schedule 08.08.2017
comment
@georg ฉันยังคงเห็นวัตถุว่างบนเบราว์เซอร์ของฉันหลังจากที่คุณแก้ไข   -  person newguy    schedule 08.08.2017
comment
@newguy: ใช่แล้ว นี่เป็นเพราะตัวอย่างข้อมูล SO ก็ทำผิดเช่นกัน การเลียนแบบคอนโซลนั้นยาก...   -  person georg    schedule 08.08.2017
comment
@georg :( มันไม่ใช่ปัญหาของฉันเหรอ ฉันดีใจที่รู้ แต่นั่นเป็นสิ่งที่น่ารำคาญจริงๆ   -  person newguy    schedule 08.08.2017


คำตอบ (5)


หมายเหตุ: คำตอบนี้เกี่ยวข้องกับสภาพแวดล้อมแซนด์บ็อกซ์ repl.it ที่ OP ใช้อยู่เท่านั้น

เนื่องจากคุณพูดในความคิดเห็นว่าคุณกำลังใช้ 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";
}

คุณจะเห็นว่า repl.it รองรับได้ที่นี่

console.log(new Map([["a", 1], ["b", 2]]));
// Logs:
/*
Map(
  a: 1
  b: 2
)
*/
person user3297291    schedule 08.08.2017
comment
ทำได้ดีนี่. ฉันเพิ่งทำสิ่งที่คล้ายกันเสร็จ แต่ฉันเลือกที่จะไอ้ console.log แทน :) repl.it/KBdU - person Dave Salomon; 08.08.2017
comment
@DaveSalomon เยี่ยมมาก! รู้สึกเหมือนเราอยู่ในสภาพแวดล้อมแซนด์บ็อกซ์ออนไลน์ มาทำลายต้นแบบดั้งเดิมและการใช้งานเริ่มต้นกันดีกว่า! ;) ถึงกระนั้น ทั้งสองวิธีสามารถช่วยในกระบวนการแก้ไขข้อบกพร่องได้ ดังนั้นจึงยินดีที่ได้เห็นว่าสามารถทำอะไรได้บ้าง - person user3297291; 08.08.2017

มีวิธีแก้ไขปัญหาที่ง่ายกว่าที่คุณสามารถลองได้

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

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

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

 console.log([...mapObject.values()]);
 // ["hello"]
person samehanwar    schedule 06.09.2020

คุณสามารถใช้ console.log(mapObject.values())

person omer    schedule 08.06.2020
comment
สิ่งที่ฉันเห็นจากสิ่งนี้คือ [object Map Iterator] {} ในคอนโซล CodePen อยู่ดี - person Noumenon; 08.01.2021
comment
คุณสามารถเพิ่มลิงค์ codepen ได้หรือไม่? - person omer; 08.01.2021

สำหรับแผนที่ธรรมดาที่มีความลึก 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]));

อย่างไรก็ตาม สิ่งนี้จะล้มเหลวสำหรับแผนที่ที่ซ้อนกันที่ซับซ้อน ด้วยเหตุนี้ เราสามารถแปลง Maps ใดๆ ให้เป็นอ็อบเจ็กต์แบบวนซ้ำแล้วจึงบันทึกตามปกติ ต่อไปนี้เป็นข้อพิสูจน์แนวคิดเกี่ยวกับโครงสร้างที่ซับซ้อนซึ่งรวมวัตถุธรรมดา Maps อาร์เรย์ และพื้นฐานเข้าด้วยกัน อย่าคาดหวังว่ามันจะครอบคลุมทุกเคส Edge ทันที แต่อย่าลังเลที่จะชี้ให้เห็นถึงการปรับปรุง

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

person ggorlen    schedule 16.09.2020
comment
ควรใช้ instanceof Map ไม่ใช่ .constructor.name == 'Map' - person Bergi; 16.09.2020

ฉันรู้ว่านี่น่าจะมีไว้สำหรับคอนโซลของเบราว์เซอร์ แต่ก็เกิดขึ้นใน 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);
person Schmeedty    schedule 01.11.2020