javascript - 如何将映射的键名更改为嵌套对象?

标签 javascript lodash

这是对象

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


这是 map

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

这是预期的结果。

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

我知道 lodash 中有一个函数 _.get 可以获取像 b.c.d 这样的值。
但是我怎样才能用 map 更改键名呢?

最佳答案

您可以通过跟踪当前路径并使用它在 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))

关于javascript - 如何将映射的键名更改为嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643644/

相关文章:

javascript - 下拉菜单的可用性

javascript - Tensorflow.js:简单的线性回归效果不佳

javascript - 分割琴弦但保持内部琴弦完好无损?

javascript - LoDash 可以搜索动态对象数组,但不能搜索类型化对象数组

javascript - 限制dumb组件中的 react 事件处理程序

javascript - 查找两个数组之间的差异

使用本地存储的 JAVASCRIPT 登录重定向

javascript - Fancybox 2 beforeLoad 和 afterClose 在事件时不触发隐藏/显示 div

javascript - 将字符串和数字中的字体大小分开;与洛达什

javascript - unEven 数组,如 concatAll 函数