オブジェクトへの参照がある場合:
var test = {};
次のようなネストされたオブジェクトが含まれる可能性があります (ただし、すぐに含まれるわけではありません)。
{level1: {level2: {level3: "level3"}}};
深くネストされたオブジェクト内のプロパティの存在を確認する最良の方法は何ですか?
alert(test.level1);
得られますundefined
が、alert(test.level1.level2.level3);
失敗します。
私は現在、次のようなことを行っています:
if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
alert(test.level1.level2.level3);
}
しかし、もっと良い方法があるのではないかと考えていました。
ベストアンサー1
が必要ない場合は、ステップごとに実行する必要があります。TypeError
メンバーの 1 つがnull
または の場合にundefined
、メンバーにアクセスしようとすると、例外がスローされるためです。
catch
単純に例外を作成するか、次のように複数のレベルの存在をテストする関数を作成することができます。
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments, 1);
for (var i = 0; i < args.length; i++) {
if (!obj || !obj.hasOwnProperty(args[i])) {
return false;
}
obj = obj[args[i]];
}
return true;
}
var test = {level1:{level2:{level3:'level3'}} };
checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false
ES6 アップデート:
これは、ES6の機能と再帰を使用した元の関数の短縮版です(適切な末尾呼び出し形状):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
ただし、ネストされたプロパティの値を取得し、その存在を確認するだけでなく、次のような簡単な 1 行の関数があります。
function getNested(obj, ...args) {
return args.reduce((obj, level) => obj && obj[level], obj)
}
const test = { level1:{ level2:{ level3:'level3'} } };
console.log(getNested(test, 'level1', 'level2', 'level3')); // 'level3'
console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); // 6
console.log(getNested(test, 'level1', 'level2', 'foo')); // undefined
console.log(getNested(test, 'a', 'b')); // undefined
上記の関数を使用すると、ネストされたプロパティの値を取得できます。それ以外の場合は を返しますundefined
。
2019-10-17更新:
のオプションの連鎖提案ステージ3に到達ECMAScript 委員会のプロセス?.
これにより、新しいオプションの連鎖演算子であるトークンを使用して、深くネストされたプロパティに安全にアクセスできるようになります。
const value = obj?.level1?.level2?.level3
アクセスされたレベルのいずれかnull
が または の場合、undefined
式はundefined
それ自体で に解決されます。
この提案により、メソッド呼び出しを安全に処理することも可能になります。
obj?.level1?.method();
上記の式は、、またはがまたはであるundefined
場合にを生成し、それ以外の場合は関数を呼び出します。obj
obj.level1
obj.level1.method
null
undefined
Babelでこの機能を試すには、
オプションの連鎖プラグイン
。
以来バベル 7.8.0ES2020はデフォルトでサポートされています
チェックこの例Babel REPL で。
����更新: 2019 年 12 月 ����
オプションの連鎖提案は最終的にステージ4に到達2019 年 12 月の TC39 委員会の会議で、この機能はECMAScript 2020標準の一部となることが発表されました。