うまく言葉に現すことが難しいのでまずはこんなコードを想定してみてください。
const projectKey = 'project.name'
const state = {
project: {
name: 'Qiita' // この値を変数 projectKey により導きたい
},
user: {
name: 'tksmrkm'
}
}
state.project.nameを参照したいですが、キーは変数によって外部から注入されるため、場合によってはuser.name
が与えられる場合もあり、そのときはtksmrkmを求めたい。
ここまで専門用語らしきものが出てこないあたりから筆者のレベルはお察しですが、それゆえ上手な検索が出来ていないためもっとまともなメソッドが用意されているかもしれないのですが、ひとまずつくってみました。
const findByDotCase = (target, key) => {
return key.split('.').reduce((prev, current) => {
if (prev[current]) {
return prev[current]
}
throw new Error(`Not found ${current}`)
}, target)
}
console.log(findByDotCase(state, projectKey)) // Qiita
もっと深くても大丈夫
const deepNestedObject = {
it: {
is: {
my: {
first: {
kiss: 'chu♥'
}
}
}
},
kiss: {
with: 'you'
}
}
console.log(findByDotCase(deepNestedObject, 'it.is.my.first.kiss')) // chu♥
末端である必要もない
console.log(findByDotCase(deepNestedObject, 'it.is.my')) // { first: { kiss: 'chu♥' } }
最後までお読みいただきありがとうございました。もし誰かの役に立ったり、改善案だったり、標準メソッドあるよって意見が出てきたりしたら感涙です。