如何将具有映射关系的键值对转化为嵌套对象?

3

这是一个对象

{
  a: 1,
  b: {
   c: {
     d: 2
   },
   e: 3
  }
}


这是地图

{
  'a': 'aaa',
  'b': 'bbb',
  'b.c.d': 'bcd'
}

以下是预期的结果。

{
  aaa: 1,
  bbb: {
   c: {
     bcd: 2
   },
   e: 3
  }
}

我知道lodash中有一个函数_.get可以像b.c.d一样获取值。 但是如何使用map更改键名呢?
1个回答

6
你可以通过递归来实现,记录当前路径并使用该路径构建一个键到map中:

let o = {a: 1,b: {c: {d: 2},e: 3}}
let map =  {
    'a': 'aaa',
    'b': 'bbb',
    'b.c.d': 'bcd'
}

function makeObj(obj, map, p=[]) {
    let ret = {}
    Object.entries(obj).forEach(([k, v]) => {
        let path = p.concat(k)                  // add onto current path
        let mapKey = map[path.join('.')] || k
        
        ret[mapKey] = (typeof v === 'object')
            ? makeObj(v, map, path)             // if an object recurse and pass on the current path  
            : v                                 // otherwise set the value
    })
    return ret
}

console.log(makeObj(o, map))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接