JavaScriptで深くネストされた値に安全にアクセスする方法
JavaScriptでは、オブジェクトの深い階層にあるプロパティへアクセスする際、途中のプロパティが存在しないとエラーが発生してしまうことがあります。そんなときに便利なのが、lodashライブラリの get メソッドです。このメソッドを使えば、どの階層のプロパティでも安全に取得できます。
1階層目のプロパティへのアクセスはシンプルですが、ネストされたプロパティへのアクセスは少し複雑です。そのため、十分にテストされたlodashのような信頼性の高いライブラリを利用するのがおすすめです。
lodashのgetメソッドを使った例
深くネストされたオブジェクトには、次のようにアクセスできます。
let _ = require("lodash");
let obj = {
a: {
b: {
foo: "test"
},
c: 2
}
};
console.log(_.get(obj, "a.b.foo"));
console.log(_.get(obj, "a.c"));
console.log(_.get(obj, "a.test"));
console.log(_.get(obj, "a.test.x"));出力結果
上記のコードを実行すると、以下の出力が得られます。
test 2 undefined undefined
注目すべき点は、存在しないパス(a.test や a.test.x)にアクセスしてもエラーにならず、単に undefined が返されることです。これにより、安全にプロパティを参照できます。
独自のgetProp関数を実装する
外部ライブラリを使いたくない場合は、再帰処理を利用して独自の getProp 関数を作成することもできます。
const getProp = (object, path) => {
if (path.length === 1) return object[path[0]];
else if (path.length === 0) throw error;
else {
if (object[path[0]]) return getProp(object[path[0]], path.slice(1));
else {
object[path[0]] = {};
return getProp(object[path[0]], path.slice(1));
}
}
};この関数を使用するには、アクセスしたいプロパティのパスを配列として渡します。
使用例
var obj = {
level1:{
level2:{
level3:{
name: "Foo"
}
},
anotherLevel2: "bar"
}
};
console.log(getProp(obj, ["level1", "level2"]));出力結果
実行すると、以下のように指定した階層のオブジェクトが取得できます。
{level3: {name: "Foo"}}まとめ
深くネストされたオブジェクトのプロパティに安全にアクセスするには、lodashの get メソッドを使うのが最も簡単で確実な方法です。また、依存関係を増やしたくない場合は、再帰的な関数を自作することでも同様の処理を実現できます。状況に応じて最適な方法を選びましょう。
-
【JavaScript】関数から返された配列にアクセスする方法
JavaScriptでは、関数の戻り値として配列を返し、呼び出し元でその配列を受け取って自由に操作することができます。本記事では、関数から返された配列へアクセスする具体的な方法を、実際に動作するサンプルコードとともに解説します。 実装例:関数から配列を返してアクセスする 以下のサンプルでは、引数に渡された数値の1倍〜10倍の値を要素とする配列を生成して返すretTable()関数を定義しています。ボタンをクリックすると、この関数が返した配列を変数で受け取り、画面に表示します。 <!DOCTYPE html> <html lang=ja> <head> &l
-
JavaScriptでfalsy値(偽と評価される値)を見分ける方法
JavaScriptにおけるfalsy値とはJavaScriptでは、値をBoolean型として評価したときに「false」とみなされる値がいくつか存在します。これらは「falsy値(偽の値)」と呼ばれます。条件分岐や論理演算において、意図しない動作を防ぐために、どの値がfalseと評価されるかを正しく理解しておくことが重要です。JavaScriptでfalseと評価される主な値は以下の通りです。false — Boolean型のfalseそのもの0 — 数値のゼロ空文字列:、、または ``(テンプレートリテラル)null — 値が存在しないことを示す特殊な値undefined — 値が未定義