Konvertieren Sie die Karte in ein JavaScript-Objekt

Lesezeit: 5 Minuten

Benutzeravatar von nixgadget
Nixgadget

Ich habe also das folgende Javascript erhalten, das ein Schlüssel/Wert-Paar enthält, um einen verschachtelten Pfad einem Verzeichnis zuzuordnen.

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

Jetzt möchte ich aus dem Schlüssel in der Karte ein JSON-Objekt erstellen.

Es muss sein,

paths: {
  aliases: {
    server: {
      entry: 'src/test'
    },
    dist: {
      entry: 'dist/test'
    }
  }
}

Ich bin mir nicht sicher, ob es dafür eine sofort einsatzbereite Möglichkeit gibt. Jede Hilfe wird geschätzt.

  • Ich würde den Schlüsselnamen mit Punkten von dieser Zeichenfolge subtrahieren und später aus dem, was ich gesammelt habe, ein Objekt erstellen.

    – Kein Emoticoner

    25. Mai 2016 um 12:59

  • Ich hasse es, wenn Leute keine Variablen deklarieren und am Ende Globale haben. Denken Sie auch daran: „Es ist ein häufiger Fehler, ein JSON-Objektliteral als „JSON-Objekt“ zu bezeichnen. JSON kann kein Objekt sein. JSON ist ein String-Format.’ (Aus W3Schulen)

    – Kapitän 171

    21. Okt. 2021 um 1:28

Benutzeravatar von wolfram77
wolfram77

Gegeben in MDN, fromEntries() ist seit Node v12 verfügbar:

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

const obj = Object.fromEntries(map1);
// { foo: 'bar', baz: 42 }

Um das Objekt wieder in eine Karte umzuwandeln:

const map2 = new Map(Object.entries(obj));
// Map(2) { 'foo' => 'bar', 'baz' => 42 }

  • Denk daran, dass Map kann Nicht-String-Schlüssel enthalten, so dass Sie beispielsweise bei new Map([[{x: 0, y: 1}, 42]])

    – ggorlen – zum LLM-Streik

    24. August 2022 um 3:10


Verwenden Sie einfach ES6-Methoden

  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 }
  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 }

Refs

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

Ich hoffe, dass diese Funktion selbsterklärend genug ist. Das ist es, was ich früher gemacht habe.

/*
 * 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)

  • ES6 – Implementierung: mapToObj(inputMap) { const obj = {}; inputMap.forEach((value, key) =>{ obj[key] = Wert; }); return obj; }

    – Tejashree

    16. Juli 2020 um 10:12 Uhr


Sie können die Karte und die Schlüssel durchlaufen und den Wert zuweisen

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

Benutzeravatar von IMTheNachoMan
IMTheNachoMan

Ein anderer Ansatz. Ich wäre gespannt, wer eine bessere Leistung hat, aber jsPerf ist ausgefallen :(.

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

Ohne Rekursion:

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

  • jsPerf ist seit Wochen ausgefallen.

    – evolutionxbox

    25. Mai 2016 um 13:31 Uhr

  • In meiner Konsole mit console.timeIhr Code benötigte im Durchschnitt 0,023 mswährend die akzeptierte Antwort im Durchschnitt dauerte 0,137 ms.

    – evolutionxbox

    25. Mai 2016 um 13:36 Uhr

  • @evolutionxbox – wenn die Rekursion durch sequentiellen Code ersetzt würde (was möglicherweise ein paar Zeilen mehr Code erfordert), würde sie wahrscheinlich wieder schneller laufen. Weniger Code bedeutet nicht unbedingt schneller. 🙂

    – RobG

    25. Mai 2016 um 21:25

  • @RobG sehr wahr. Dabei handelte es sich um sehr grobe Leistungstests. Auf jedem wurden etwa 20 „Läufe“ durchgeführt.

    – evolutionxbox

    25. Mai 2016 um 22:11 Uhr

  • @RobG: Ich weiß, aber Rekursion ist so cool. :PI hat ein Beispiel ohne Rekursion hinzugefügt.

    – IMTheNachoMan

    26. Mai 2016 um 14:21

Benutzeravatar von Subhash Dhaka
Subhash Dhaka

var items = {1:"apple",2:"orange",3:"pineapple"};
let map = new Map(Object.entries(items)); //object to map
console.log(map);
const obj = new Object();
map.forEach((value,key)=> obj[key]=value);  // map to object
console.log(obj);

  • jsPerf ist seit Wochen ausgefallen.

    – evolutionxbox

    25. Mai 2016 um 13:31 Uhr

  • In meiner Konsole mit console.timeIhr Code benötigte im Durchschnitt 0,023 mswährend die akzeptierte Antwort im Durchschnitt dauerte 0,137 ms.

    – evolutionxbox

    25. Mai 2016 um 13:36 Uhr

  • @evolutionxbox – wenn die Rekursion durch sequentiellen Code ersetzt würde (was möglicherweise ein paar Zeilen mehr Code erfordert), würde sie wahrscheinlich wieder schneller laufen. Weniger Code bedeutet nicht unbedingt schneller. 🙂

    – RobG

    25. Mai 2016 um 21:25

  • @RobG sehr wahr. Dabei handelte es sich um sehr grobe Leistungstests. Auf jedem wurden etwa 20 „Läufe“ durchgeführt.

    – evolutionxbox

    25. Mai 2016 um 22:11 Uhr

  • @RobG: Ich weiß, aber Rekursion ist so cool. :PI hat ein Beispiel ohne Rekursion hinzugefügt.

    – IMTheNachoMan

    26. Mai 2016 um 14:21

1453700cookie-checkKonvertieren Sie die Karte in ein JavaScript-Objekt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy