首页 > 解决方案 > JavaScript 将嵌套 Map 转换为对象

问题描述

我想将 es6 嵌套 Map 转换为对象。

我试过这段代码:

    mapToObjectRec(m) {
      let lo = {}
      for(let[k,v] of m) {
          if(v instanceof Map) {
              lo[k] = this.mapToObjectRec(v)
          }
          else {
              lo[k] = v
          }
      }
      return lo
    }

我想做与此功能相反的操作:

export declare type IElementsMap = Map<string, IElements>;


deserializeElements(json: any): IElementsMaps | any {
    const elementsMap = new Map<string, IElementsMap>();

    if (Array.isArray(json)) {
      json.forEach(outer => {
        const elementMap = new Map<string, IElements>();
        outer[1].forEach(inner => {
          elementMap.set(inner[0], inner[1]);
        });
        elementsMap.set(outer[0], elementMap);
      });

      return elementsMap;
    }

    return json;
  }

我想在有效负载请求(发布请求)中发送转换后的数据。

标签: javascriptdictionaryecmascript-6

解决方案


如果 Map 的键是数字、字符串或符号,则以下技术将起作用 -

const m =
  new Map
    ( [ [ 'a', 1 ]
      , [ 'b', 2 ]
      , [ 'c'
        , new Map
            ( [ [ 'd', 3 ]
              , [ 'e', 4 ]
              , [ 'f'
                , new Map ([[ 'g', 6 ]])
                ]
              ]
            )
        ]
      ]
    )
    
const toObject = (map = new Map) =>
  Object.fromEntries
    ( Array.from
        ( map.entries()
        , ([ k, v ]) =>
            v instanceof Map
              ? [ k, toObject (v) ]
              : [ k, v ]
        )
    )
    
console .log (toObject (m))
// { a: 1
// , b: 2
// , c:
//     { d: 3
//     , e: 4
//     , f: { g: 6 }
//     }
// }

否则,如果 Map 键是复杂对象并且不能可靠地强制转换为字符串,则您必须提出另一个保留键的实际值的映射,例如 -

const m =
  new Map
    ( [ [ 'a', 1 ]
      , [ 'b', 2 ]
      , [ 'c'
        , new Map
            ( [ [ 'd', 3 ]
              , [ 'e', 4 ]
              , [ 'f'
                , new Map ([[ 'g', 6 ]])
                ]
              ]
            )
        ]
      ]
    )
    
const toObject = (map = new Map) =>
  Array.from
    ( map.entries()
    , ([ k, v ]) =>
        v instanceof Map
          ? { key: k, value: toObject (v) }
          : { key: k, value: v }
    )
    
console .log (toObject (m))
// [ { key: "a", value: 1 }
// , { key: "b", value: 2 }
// , { key: "c"
//   , value:
//       [ { key: "d", value: 3 }
//       , { key: "e", value: 4 }
//       , { key: "f", value: [ { key: "g", value: 6 } ] }
//       ]
//   }
// ]


推荐阅读