首页 > 解决方案 > 获取嵌套值的路径

问题描述

我想这一定是一个骗局,但我在 SO 上找不到它。给定这样的对象:

let obj = { keyA: { keyB: 'hi', keyC: { keyD: null } }, keyE: 'hi' }

有没有办法可以找到给定值的关键路径,如下所示:

keyPaths(obj, 'hi') // -> [ 'keyA.keyB', 'keyE' ]
keyPaths(obj)       // -> [ 'keyA.keyB.keyD' ]

我试图调整一些在知道密钥的情况下找到深度值的答案,而我几乎能够调整找到深度 nulls的答案,但我不知道如何找回路径,而不仅仅是最深的密钥.

标签: javascript

解决方案


reduce通过在递归函数内部使用,您可以非常干净地做到这一点。该函数将返回一个数组,您可以将其返回map()到您想要的任何字符串值。

let obj = { keyA: { keyB: 'hi', keyC: { keyD: null } }, keyE: 'hi' }

function keyPaths(obj, val, path = [] ){
  if (!obj) return 
  return Object.entries(obj).reduce((res, [k, v]) => {
    let p = [...path, k]
    if (v == val) res.push(p)
    else if (v && typeof v == 'object') res.push(...keyPaths(v, val, p))
    return res
  }, [])
}

console.log(keyPaths(obj, 'hi').map(a => a.join('.')))
console.log(keyPaths(obj).map(a => a.join('|')))


推荐阅读