javascript - 获取嵌套值的路径
问题描述
我想这一定是一个骗局,但我在 SO 上找不到它。给定这样的对象:
let obj = { keyA: { keyB: 'hi', keyC: { keyD: null } }, keyE: 'hi' }
有没有办法可以找到给定值的关键路径,如下所示:
keyPaths(obj, 'hi') // -> [ 'keyA.keyB', 'keyE' ]
keyPaths(obj) // -> [ 'keyA.keyB.keyD' ]
我试图调整一些在知道密钥的情况下找到深度值的答案,而我几乎能够调整找到深度 nulls的答案,但我不知道如何找回路径,而不仅仅是最深的密钥.
解决方案
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('|')))
推荐阅读
- python - Can an empty line be present within the body of a HTTP response message?
- mongodb - 如何检索新文档并将其添加到 MongoDb 集合中抛出 com.mongodb.reactivestreams.client.MongoClient
- python - 在列上滚动总和,同时按其他列和相对位置加权
- ios - iOS 14.2 将应用程序音频输出定向到耳机而不是底部扬声器
- google-maps - 将地址转换为 Google Maps Local Context 的坐标(地理编码 + Local Context Maps)
- javascript - jQuery-循环按钮在单击时添加活动类
- javascript - Javascript异步函数返回字符串而不是承诺
- javascript - onClick 函数需要两次点击才能更新状态
- flutter - SingleChildScrollView 的内容没有变成全高
- c - 如何用一个字符替换两个字符?