ネストされた JavaScript オブジェクトキーの存在をテストする 質問する

ネストされた JavaScript オブジェクトキーの存在をテストする 質問する

オブジェクトへの参照がある場合:

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場合にを生成し、それ以外の場合は関数を呼び出します。objobj.level1obj.level1.methodnullundefined

Babelでこの機能を試すには、 オプションの連鎖プラグイン

以来バベル 7.8.0ES2020はデフォルトでサポートされています

チェックこの例Babel REPL で。

����更新: 2019 年 12 月 ����

オプションの連鎖提案は最終的にステージ4に到達2019 年 12 月の TC39 委員会の会議で、この機能はECMAScript 2020標準の一部となることが発表されました。

おすすめ記事