#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 .