const deepGet = (obj, prop) => {
let keys = prop.split(".").map((i) => i.trim())
if (!keys) return undefined
let res = keys.reduce((prev, curr) => {
let objKey = curr.split("[")
if (prev && Object.keys(prev).includes(objKey[0])) {
if (objKey.length > 1 && Array.isArray(prev[objKey[0]])) {
let idx = objKey[1].slice(0, -1).trim()
return prev[objKey[0]][idx]
} else if (objKey.length > 1 && !Array.isArray(prev[objKey[0]])) {
return undefined
} else {
return prev[objKey[0]]
}
} else {
return undefined
}
}, obj)
return res
}
deepGet(
{
school: {
student: { name: "Tomy" },
},
},
"school.student.name"
)
deepGet(
{
school: {
students: [{ name: "Tomy" }, { name: "Lucy" }],
},
},
"school.students[1].name"
)
deepGet({ user: { name: "Tomy" } }, "user.age")
deepGet({ user: { name: "Tomy" } }, "school.user.age")