LoginSignup
5
4

More than 5 years have passed since last update.

ネストされたオブジェクトをドット記法の文字列で探索したい

Posted at

うまく言葉に現すことが難しいのでまずはこんなコードを想定してみてください。

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♥' } }

最後までお読みいただきありがとうございました。もし誰かの役に立ったり、改善案だったり、標準メソッドあるよって意見が出てきたりしたら感涙です。

5
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4