JavaScript 将嵌套 Map 转换为对象

标签 javascript dictionary ecmascript-6

我想将 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;
  }

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

最佳答案

如果 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 } ] }
//       ]
//   }
// ]

关于JavaScript 将嵌套 Map 转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611237/

相关文章:

javascript - jquery动态更新select中的 "other"选项

javascript - 创建 Angular 项目时出错

python - 如果字段名称与 python 中的字典值匹配,则求和

node.js - ESLint 规则在用户模块和标准 Node 模块之间插入一个空行

javascript - 如何删除JS中的属性并映射新对象?

javascript - 将 "this"保留在变量中并将所有 "this"替换为该变量?

javascript - 将值从表传递到输入文本 Angularjs

python - 通过查找比较python中的2个字典

python - Pandas:迭代连接存储在数据框字典中的列

基于先前值的 Javascript 过滤器