Есть несколько способов выполнить то, что вы хотите:
Тернарный оператор
Используя троичный оператор, вы можете получить что-то вроде:
vm.user = {
userBag:[
{
name: nameService ? nameService.nameBag[0].organizationName : ''
},
{
name: nameService ? nameService.nameBag[1].organizationName : ''
},
{
name: nameService ? nameService.nameBag[2].organizationName : ''
}
]
};
Или оператор
С помощью оператора ||
вы можете оценить, существует ли путь, к которому вы хотите получить доступ, или он имеет значение:
{
name: (nameService && ... && nameService.nameBag[0].organizationName) || ''
}
Необязательная функция доступа
Однако, чтобы сохранитьвещи DRY Я бы предпочел использовать функцию для необязательного доступа, что-то вроде:
function optionalAccess(obj, path, def) {
const propNames = path.replace(/\]|\)/,'').split(/\.|\[|\(/);
return propNames.reduce((acc, prop) => acc[prop] || def, obj);
}
const obj = {
items: [{ hello: "Hello" }]
};
console.log(optionalAccess(obj, "items[0].hello", "def")); // prints: Hello
console.log(optionalAccess(obj, "items[0].he", "def")); // prints: def
TC39 Proposal
В настоящее время существует предложение вДля того, чтобы можно было использовать цепочку, что позволит вам сделать что-то вроде:
nameService?.nameBag[0]?.organizationName || ''
Если вы хотите сделать что-то подобное, есть также плагин babel
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining