javascript – 如何使用map将键名更改为嵌套对象?

这是对象

{
  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这样的值.

但是如何使用地图更改密钥名称?

解决方法:

您可以通过跟踪当前路径并使用以下方法在地图中构建密钥来递归执行此操作:

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))
上一篇:javascript – 有没有办法在Lodash或Underscore中指定null的默认值?


下一篇:javascript – 为什么`lodash.map([‘A’],String.prototype.toLowerCase.call)`不起作用?