簡體   English   中英

在Javascript中將Map轉換為JSON對象

[英]Convert Map to JSON object in Javascript

所以我得到了以下 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');

現在我想做的是從地圖中的鍵創建一個 JSON 對象。

必須是,

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

不確定是否有開箱即用的方法來做到這一點。 任何幫助表示贊賞。

MDN 中fromEntries()從 Node v12 開始可用:

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

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

將對象轉換回地圖:

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

我希望這個功能是不言自明的。 這就是我過去所做的工作。

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

您可以遍歷地圖和鍵並分配值

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

僅使用 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 }

  1. ...spreaddestructuring 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 }

參考

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

另一種方法。 我很好奇哪個性能更好,但 jsPerf 已關閉 :(。

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

沒有遞歸:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM