这是对象
{
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))