Как элегантно проверить наличие последовательных объектов

#javascript

#javascript

Вопрос:

Есть ли какой-нибудь способ написать это более элегантно?

 if ("a" in obj amp;amp; "b" in obj.a amp;amp; "c" in obj.a.b)
  

вместо проверки наличия на каждом этапе объекта?

Если я это сделаю if ("c" in obj.a.b) , это выдаст ошибку, если a or b не существует.

Комментарии:

1. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

2. если ваша среда выполнения поддерживает это, вы можете использовать необязательную цепочку if ("c" in (obj?.a?.b ?? {}))

Ответ №1:

Я всегда находил функции Lodash _.has и _.get очень мощными, вы можете получить доступ к глубоко вложенным значениям в объектах без большого количества кода для проверки существования пути.

Например:

 const obj = { a: { b: { c: 42 }}};

if (_.has(obj, "a.b.c")) {
    console.log("Path exists");
}

// Safe to access, will return undefined if path does not exist...
console.log("Path value:", _.get(obj, "a.b.c"));  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>  

Ответ №2:

Старый способ

 if (obj.a amp;amp; obj.a.b amp;amp; obj.a.b.c) {
  // do something
}
  

Новый способ

Необязательная цепочка

 if (obj.a?.b?.c) {
  // do something
}
  

Ответ №3:

Вспомогательная функция pluckDeep

 function pluckDeep(key) {

   return function(obj) {

        return key.split('.').reduce((accum, key) => {
            return accum[key]
        }, obj);

   }

}

const obj = { a: { b: { c: 42 }}};


if (pluckDeep('a.b.c')(obj)) {
  // do something
}
  

Эта функция curried может определить, существует ли свойство, используя первый параметр функции pluckDeep .