Bagaimana saya bisa Menampilkan Objek Peta JavaScript ES6 ke Konsol?

Saya menggunakan repl.it/linguals/javascript.

Apakah saya harus mengubahnya menjadi objek sebelum mencetaknya?

Saya sudah mencoba

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

Hasilnya selalu berupa benda kosong.

Saat saya menggunakan

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

Ini mencetak format array.


person newguy    schedule 08.08.2017    source sumber
comment
console.log(mapObject) berfungsi dengan baik di Chrome dan node7 terbaru. Apa platform Anda?   -  person georg    schedule 08.08.2017
comment
@georg repl.it/linguals/javascript   -  person newguy    schedule 08.08.2017
comment
Gunakan console.dir sebagai pengganti .log, dan tanpa merangkainya.   -  person Teemu    schedule 08.08.2017
comment
@newguy: baiklah, bagaimana kalau Anda menghubungi mereka dan meminta untuk memperbaikinya?   -  person georg    schedule 08.08.2017
comment
@georg Saya masih melihat objek kosong di browser saya setelah Anda mengedit.   -  person newguy    schedule 08.08.2017
comment
@newguy: ya, ini karena cuplikan SO juga salah. Meniru konsol itu sulit...   -  person georg    schedule 08.08.2017
comment
@georg :( jadi itu bukan masalah saya? Saya senang mengetahuinya. Tapi itu hal yang sangat menjengkelkan.   -  person newguy    schedule 08.08.2017


Jawaban (5)


Catatan: Jawaban ini hanya relevan dengan lingkungan sandbox repl.it yang digunakan OP

Karena Anda mengatakan di komentar bahwa Anda menggunakan repl.it, ada trik yang dapat Anda gunakan untuk menulis "strategi logging" Anda sendiri.

Perhatikan bahwa Anda tidak boleh menggunakan trik ini dalam produksi, terutama karena trik ini mengedit prototipe asli. Di beberapa lingkungan Node, dalam kode Anda sendiri, ini bisa berguna.

Idenya adalah untuk membuat metode inspect untuk Map yang mengulangi entries:

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

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

Anda dapat melihat bahwa repl.it mendukungnya di sini

console.log(new Map([["a", 1], ["b", 2]]));
// Logs:
/*
Map(
  a: 1
  b: 2
)
*/
person user3297291    schedule 08.08.2017
comment
Bagus sekali. Saya baru saja menyelesaikan hal serupa, namun saya memilih untuk melakukan bajingan pada console.log mereka :) repl.it/KBdU - person Dave Salomon; 08.08.2017
comment
@DaveSalomon Bagus! Terasa seperti Kami berada di lingkungan kotak pasir online; mari kita hancurkan semua prototipe asli dan implementasi default! ;) Namun, kedua pendekatan tersebut dapat membantu dalam proses debugging, jadi senang melihat apa yang bisa dilakukan. - person user3297291; 08.08.2017

ada solusi yang lebih sederhana yang bisa Anda coba.

 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

kamu dapat menggunakan console.log(mapObject.values())

person omer    schedule 08.06.2020
comment
Yang saya lihat dari ini adalah [object Map Iterator] {}, di konsol CodePen. - person Noumenon; 08.01.2021
comment
Bisakah Anda menambahkan tautan codepen? - person omer; 08.01.2021

Untuk peta sederhana dengan kedalaman 1, cukup gunakan Object.fromEntries([...map]) untuk mengonversi array entri objek Anda kembali ke objek konsol yang dapat dicatat:

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

Namun, hal ini gagal untuk peta bertingkat yang kompleks. Untuk itu, kita dapat mengonversi Maps menjadi objek secara rekursif lalu mencatatnya seperti biasa. Berikut adalah bukti konsep pada struktur kompleks yang menggabungkan objek biasa, Maps, array, dan primitif. Jangan berharap hal ini dapat mencakup semua kasus yang ada, namun jangan ragu untuk menunjukkan perbaikannya.

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
Lebih baik gunakan instanceof Map, bukan .constructor.name == 'Map'. - person Bergi; 16.09.2020

Saya menyadari ini kemungkinan besar ditujukan untuk konsol browser tetapi ini juga terjadi di Node.js. Jadi, Anda dapat menggunakan ini di Node untuk melihat Peta (atau Objek yang mungkin berisi Peta):

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